/*思路:任何一个大于1的数可以分解成 n=a1^p1*a2^p2*a3^p3*...*an^pn,
n的约数总数为(p1+1)*(p2+1)*...*(pn+1), (0,1,...,p1)(0,1,...,p2)...(0,1,...,pn)
不难发现(1+2+...+p1+1)(1+2+...+p2+1)...(1+2+...+pn+1)即为所求
一般而言,任取一自然数N,他的因数有1,n1,n2,n3,……,nk,N,
这些因数的因数个数分别为1,m1,m2,m3,……,mk,k+2,则
1^3+m1^3+m2^3+m3^3+……+mk^3+(k+2)^3
=(1+m1+m2+m3+……+mk+k+2)^2
本题可由poj 3604 Professor Ben这题YY;
转载自:http://blog.foreverzeus.com/?p=739
poj 3604 Professor Ben 积性函数
注意该题求的是给出n,n的约数为pi
然后求的就是这些pi的约数的个数的立方和
f(n)表示n的约数的个数
n分解质因数为pi^ei (pi为质因数 ei为指数)
那么f(n)=∏(ei+1); (∏为连乘的符号)
设g(n)为所求结果
那么g(n)=g(∏pi^ei);
对于每个pi^ei有:(因为g表示的是每个约数的约数的个数)
g(pi^ei)=f(pi^0)+f(pi^1)+f(pi^2)+….+f(pi^ei)
=1+2+3+….+(ei+1);
当然对于答案是要把这些求立方和
立方和公式为:1^3 + 2^3 + …… n^3 = [n (n+1) / 2]^2
故对于每个pi^ei有g(pi^ei)=((ei+1)*(ei+2)/2)^2;
因为g满足积性函数故g(n*m)=g(n)*g(m);
故:
g(∏pi^ei)=g(p1^e1)*g(p2^e2)…g(pn^en)
=∏(((ei+1)*(ei+2)/2)^2)
*/
#include <iostream>
using namespace std;
#define MAXN 1001
__int64 a,b;
int prim[MAXN],pcnt;
bool is_prim[MAXN];
void prepare()
{
memset(is_prim,true,sizeof(is_prim));
pcnt=0;
__int64 i,j;
for(i=2;i<MAXN;i++)
{
if(is_prim[i])
{
for(j=i;i*j<MAXN;j++)
is_prim[i*j]=false;
prim[pcnt++]=i;
}
}
}
int main()
{
__int64 i,j,k,ans,tt,T=1;
prepare();
while(scanf("%d%d",&a,&b)!=EOF)
{
ans=1;
b%=10007;
for(i=0;i<pcnt && prim[i]*prim[i]<=a && a!=1;i++)
{
for(j=0;a%prim[i]==0;j++)
a/=prim[i];
tt=(j*b+1)*(j*b+2)/2%10007;//立方和公式
tt*=tt;
ans=ans*tt%10007;
}
if(a!=1)
{
tt=(b+1)*(b+2)/2%10007;
tt*=tt;
ans=ans*tt%10007;
}
printf("Case %I64d: %I64d\n",T++,ans);
}
return 0;
}