?
思路:找规律,发现符合要求的数为
[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#include #include #include 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 ?