题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=108150#problem/B
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
__int64 solve(__int64 k)
{
__int64 sum=0;
for(__int64 i=1; i*i*i<=k; i++)
{
sum+=(k/(i*i)-i+1);
}
return sum;
}
int main()
{
__int64 x,y;
while(~scanf("%I64d%I64d",&x,&y))
{
x--;
printf("%I64d\n",solve(y)-solve(x));
}
return 0;
} //visual c++;
代码:
#include <cstdio>
#include <cmath>
typedef __int64 LL;
LL a, b;
LL cal(LL k)
{
LL p = (LL)pow((double)k,1.0/3);
LL ans = 0;
for(LL i = 1; i <= p; i++)
{
ans += k/(i*i)-i+1;
}
return ans;
}
int main()
{
while(~scanf("%I64d%I64d",&a,&b))
{
LL sum = cal(b)-cal(a-1);
printf("%I64d\n",sum);
}
return 0; // <span style="font-size: 13.3333px;">GNU C++</span>
}
分析:
a,b(1<=a<=b<=10^15)点想办法把循环的次数降下来
1*1*1 1*1*2 1*1*3
2*2*2 2*2*3 2*2*4
3*3*3 3*3*4 3*3*5
这样循环a。