题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3629
思路:找规律,发现符合要求的数为
[0,1)
[4,9)
[16,25)
[36,49)
…………
[n^2 , (n+1)^2)
发现 n^2 到(n+1)^2(n为偶数)前开后闭的区间为符合要求的数,然后发现(n+1)*(n+1)-n*n组成的数列为一个差值为4等差数列,我们需要求区间[a,b]符合要求的数,那么只需要用b前面符合要求的数减去a-1中符合要求的数。。。。。
开始的时候一直WA,到后才发现输入输出时用的%I64d要换成%lld,悲剧呀。。。。。。
code:
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> using namespace std; typedef long long LL; LL f(LL x) //计算0到x之间符合要求的数,等差数列首项看为1 { if(x==-1) return 0; LL a=sqrt(x); LL sum=0; if(a*a==x) { LL n=(a+1)/2; sum=n+n*(n-1)*2; if(a%2==0) { sum++; } } else if(a*a<x) { if(a%2==0) { LL n=a/2; sum=n+n*(n-1)*2; sum+=(x-a*a+1); } if(a%2==1) { LL n=(a+1)/2; sum=n+n*(n-1)*2; } } return sum; } int main() { long long a,b,m,n,i; while(scanf("%lld%lld",&a,&b)==2) { printf("%lld\n",f(b)-f(a-1)); //cout<<f(b)-f(a-1)<<endl; } return 0; }
原文地址:http://blog.csdn.net/u010304217/article/details/38903983