1 条题解

  • 0
    @ 2023-10-25 17:26:01

    问题:求 1,2,3,...,n1,2,3,...,n 的奇数和,其中 n232n≤2^{32}

    等差数列:当首项为 a1a_1,末项为 ana_n,项数为 nn,其前 nn 项和 s=(a1+an)n2s=\frac{(a_1+a_n)* n}{2}

    分析:循环肯定TLE,明显存在规律,有nn 为奇数和偶数时有不同情况,分情况讨论;

    1. nn 是奇数的时候,s=1+3+5+...+n;s=1+3+5+...+n; 假设有 kk 项元素,则 1+(k1)2=n1+(k-1)*2=n,解出 k=n12+1=n+12k=\frac{n-1}{2}+1=\frac{n+1}{2} s=(1+n)k2=(n+1)24s=\frac{(1+n)*k}{2}=\frac{(n+1)^2}{4} 在程序中 2642^{64} 会溢出,所以可以写成 ((n+1)/2)((n+1)/2)((n+1)/2) * ((n+1)/2).
    2. nn 是偶数的时候,s=1+3+5+...+n1;s=1+3+5+...+n-1; 假设有 kk 项元素,则 1+(k1)2=n11+(k-1)*2=n-1,解出 k=n112+1=n2k=\frac{n-1-1}{2}+1=\frac{n}{2} s=(1+n1)k2=(n)24s=\frac{(1+n-1)*k}{2}=\frac{(n)^2}{4} 在程序中 2642^{64} 会溢出,所以可以写成 (n/2)(n/2)(n/2) * (n/2)
    #include<stdio.h>
    #include<math.h>
    
    #define pi 3.14
    const double eps = 1e-6;
    
    int main(){
    	long long n; scanf("%lld", &n);
    	
    	if(n %2 ==1) n++;
    	long long res = n/2 * (n/2);
    	printf("%lld", res);
    }
    
    • 1

    信息

    ID
    47
    时间
    1000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    200
    已通过
    50
    上传者