题目链接: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;
}