/*思路:任何一个大于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;
}

posted on 2011-08-11 09:00  →木头←  阅读(704)  评论(0编辑  收藏  举报