果然智商捉急啊,这题看了好久,想了好久才想明白!!
任何一个大于1的数都能分解为一些质数的乘积 n=p1^e1*p2^e2*p3^e3...*pn^en
N的因子个数为(e1+1)*(e2+1)*...*(en+1)
只题求A^B 的因子的因子个数的3次方的和(好别扭!)
如2^3=8 因子为 1,2 ,4, 8 它们分别的因子个数为1 2 3 4 所以结果为1^3+2^3+3^3+4^3=1+8+27+64=100
我们先对A分解质因数 A=(p1^e1*p2^e2*p3^e3...*pn^en)^b=p1^(b*e1)*p2^(b*e2).....*pn^(b*en)
因此A的因子 可能有 p1^0 p1^1....p2^(b*e1) 分别的因子个数为 1 (1+1) (2+1)。。。(b*e1+1)
有因为 1^3+2^3+...+n^3=((n*(n+1)/2)^2 所以为((b*e1+1)*(b*e1+2)/2)^2
A的因子是A的所以质因子的幂的排列组合 因此用乘法
如果A为一个超出素数表的数 不能被分解 那么结果应为((b+1)*(b+2)/2)^2
#include<stdio.h>
#include<string.h>
#include<math.h>
#define mod 10007
bool isprime[1000];
__int64 res[1000];
int prime[1000];
int main()
{
int n;
int i,j;
memset(isprime,true,sizeof(isprime));
for(i=2;i<500;i++)
{
for(j=2;i*j<1000;j++)
isprime[i*j]=false;
}
int k=0;
for(i=2;i<1000;i++)
{
if(isprime[i])
prime[k++]=i;
}
int cnt=1;
int a,b;
while(scanf("%d%d",&a,&b)==2)
{
printf("Case %d: ",cnt++);
if(a==1)
{
printf("1\n");
continue;
}
b%=mod;
int total=0;
memset(res,0,sizeof(res));
for(i=0;a!=1&&i<k;i++)
{
if(a%prime[i]==0)
{
while(a%prime[i]==0)
{
res[total]++;
a/=prime[i];
}
total++;
}
}
if(a!=1) //当前素数都除不尽,一定为一个大素数
res[total++]=1;
__int64 ans=1;
__int64 s;
for(i=0;i<total;i++)
{
s=((b*res[i]+1)*(b*res[i]+2)/2)%mod;
s=(s*s)%mod;
ans=(ans*s)%mod;
}
printf("%I64d\n",ans);
}
return 0;
}