题意:输入一个数n,它的因子为ai,对于每个ai,bi表示ai的因子数。现在求的是∑bi^3。
题解:对于一个数n,可以分解质因数,得到n=p1^t1*p2^t2...*pk^tk(pi为素数)。则因子就是第pi的指数,取(0~ti)中的一个数,共(1+t1)*(1+t2)*...*(1+tk)个因子。对于其中一个因子m=p1^c1*...*pk^ck,则bm=(c1+1)^3*...*(ck+1)^3。a答案就是ans=(1^3+2^3+...+(t1+1)^3)*(1^3+2^3+...*(t2+1)^3)*...*(1^3+2^3+...+(tk+1)^3);又我们知道公式1^3+2^3+...+n^3=((n+1)*n/2)^2。因而就是直接求了。需要预处理出素数表,减少时间复杂度。
耗时:2594MS/5000MS
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=5e6+10;
int prime[maxn],t,vis[maxn];
void init()//打出素数表
{
int i,j,k,m;
m=(int)sqrt(maxn+0.5);
t=0;
memset(vis,0,sizeof(vis));
for(i=2;i<=m;i++)
{
if(!vis[i])
for(j=i*i;j<maxn;j+=i)
vis[j]=1;
}
for(i=2;i<maxn;i++)
if(!vis[i])prime[t++]=i;
}
int main()
{
init();
int n,T,m;
scanf("%d",&T);
while(T--)
{
int i,j,k,ans=1,t=0;
scanf("%d",&n);
m=(int)sqrt(n+0.5);
for(i=0;prime[i]<=m;i++)
{
if(n%prime[i]==0)
{
t=0;
while(n%prime[i]==0){n=n/prime[i];t++;}
ans=ans*(t+1)*(t+1)*(t+2)*(t+2)/4;
}
}
if(n>1)ans*=9;
printf("%d\n",ans);
}
return 0;
}