不废。。。。不废。。。。。
居然真的可以因为i,j,k不是__int64而WA掉诶。。。。一直以为这种循环变量没有关系的。
好像有点理解了。。。是这样的,稍微自己列个式子就可以发现dp[n]为dp[n-1]+f[n]*n。所以这道题的难点就是怎样求(i*n)/gcd(i/k,n/k),
**tip:gcd(i/k,n/k)=gcd(i,n)/k。
但是我们可以发现 gcd那一坨一坨的枚举到最后肯定是n的因子,所以就是n的所有因子都要用上。就可以想到枚举n的所有因子j。
因为j是n的因子,所以枚举它也就可以枚举到所有的1-n。
但是还不大懂为什么可以正好枚举的不重复不遗漏。
#include <stdio.h>
#include <string.h>
#define maxn 500005
#define ll __int64
ll dp[maxn],ans[maxn];
void init()
{
ll i,j;
//memset(ans,0,sizeof(ans));
for(i=1;i<=maxn;i++)
for(j=i;j<=maxn;j+=i)
ans[j]+=(1+j/i)*(j/i)/2;
}
void findd()
{
ll i,j,k;
ll mod=1;
mod=mod<<32;
dp[1]=1;
for(i=2;i<=maxn;i++)
{dp[i]=dp[i-1]+ans[i]*i;
dp[i]%=mod;}
}
int main()
{
int t;
scanf("%d",&t);
init();
findd();
int cas=0;
while(t--)
{
int n;
scanf("%d",&n);
printf("Case #%d: %I64d\n",++cas,dp[n]);
}
return 0;
}