pku 3604 Professor Ben 积性函数加筛法

这题是应用积性函数的性质来做的(我不会证明)!因为数据量很大,时间卡的很死(不像应用积性函数的pku2480),所以还要用筛法优化才能过!附代码:

Memory: 39344K Time: 2641MS #include <iostream> using namespace std; __int64 cube[32], F[5000010]; void solve() { __int64 i, k, n, m, r; memset(cube, 0, sizeof(cube)); memset(F, 0, sizeof(F));//保存结果 cube[1]=1; for(i=2; i<32; i++)//求小于或等于i的立方和 cube[i]=cube[i-1]+i*i*i; F[1]=1; //筛法求F[n],找到一个素数m,求其F值(9) //并将所有大于m并且其最大因子为m的数的F值求出来 for(m=2; m<=5000000; m++) if(!F[m])//此时m一定为素数,因为如果它不是素数, {//那么它的最大因子一定会小于它,前面一定把它求出来了 n=m;//注意m在后面要变化的,所以赋给另一个变量 F[n]=9; //将m的幂的F值求出来 for(k=2,n=m*m; n<=5000000; n*=m, k++) F[n]=cube[k+1]; //求出最大因子为m的数的F值 for(n=m+m; n<=5000000; n+=m) { if(!F[n]&&F[n/m]) {//加个F[n/m]快很多,排除了最大因子不为m的一些数 //比如说m=2时,n=6,12,14,18等 k=0, r=n; while(r%m==0) { k++; r/=m; } F[n]=F[r]*F[n/r];//满足积性函数 } } } } int main() { __int64 t, n; solve(); scanf("%I64d", &t); while(t--) { scanf("%I64d", &n); printf("%I64d/n", F[n]); } return 0; }

你可能感兴趣的:(优化,360)