这是去年成都邀请赛的题,听zz_1215说这个数论题很独特,果然如此,现场赛只有3个队通过竟然。。。后来看了题解,顿时惊呆。。
首先先来看一个这样的题,问f(1)+f(2)+..+f(n),其中f(x)是x的约数的个数
这个问题可以转换为a*b<=n的解的个数来解决。(PS:这个问题以前见过,但我没有往这方面想,我对这道题的理解是枚举约数,然后分别计算,答案是n/1+n/2+..+n/n
然而不同的理解方式显然有着很大的区别,如果按照第一种思维方式去理解,显然拿到这道题后就得心应手了
言归正传,这道题是不是可以转化为a*b*c<=n的解的个数。。。?OK,附代码吧。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
__int64 i,j,n,zs;
int cas=0;
while (scanf("%I64d",&n)!=EOF)
{
cas++;
zs=0;
for (i=1;i*i*i<=n;i++)
for (j=i;i*j*j<=n;j++)
{
__int64 k1,k2;
k1=j;
k2=n/(i*j);
if (i!=j)
{
zs=zs+6*(k2-k1+1);
zs-=3;
}
else
{
zs=zs+3*(k2-k1+1);
zs-=2;
}
}
printf("Case %d: %I64d\n",cas,zs);
}
return 0;
}