hdu 2421

时间卡的真厉害,比赛五个小时都在优化

求出A的质因子A^B=(a0^p0*a1^pq*……*an^pn)^B=a0^(B*p0)*……*an^(B*pn)

aj^(B*pj)有B*pj+1个因子(aj^0,aj^1……aj^(B*pj)),因子aj^i的因子个数是i+1个;

(1^3+2^3+……(B*pj+1)^3)

所以M=(1^3+2^3+……(B*p0+1)^3)*(1^3+2^3+……(B*p1+1)^3)*……*(1^3+2^3+……(B*pn+1)^3)


n项立方和的公式n^2*(n+1)^2/4






#include<stdio.h>
#include<string.h>
#define inf 10007
int prim[200];
int f[1010];
int main()
{
    int i,j,n,k,op=1,num;
    __int64 temp,flag,sum,A,B;
    memset(f,0,sizeof(f));
    num=0;
    for(i=2;i<=40;i++)
    {
        if(f[i]==1)continue;
        for(j=i+i;j<1010;j+=i)
        {
            f[j]=1;
        }
    }   
    for(i=2;i<1010;i++)
    {
        if(f[i]==0)
            prim[num++]=i;
    }
    while(scanf("%I64d%I64d",&A,&B)!=-1)//用int定义A,B就Wrong了
    {
        B%=inf;
        printf("Case %d: ",op++);
        if(A==1){printf("1\n");continue;}
        n=A;
        k=0;
        temp=1;
        while(n>1&&k<num)
        {
            i=0;
            while(n%prim[k]==0)
            {
                i++;n/=prim[k];
            }
            sum=((i*B+1)*(i*B+2)/2)%inf;
            sum=(sum*sum)%inf;
            temp=(temp*sum)%inf;            
            k++;
        }
        if(n>1)//如果没找到质因子,质因子就是自身,有B+1个
        {
            sum=((B+1)*(B+2)/2)%inf;
            sum=(sum*sum)%inf;
            temp=(temp*sum)%inf;
        }
        printf("%I64d\n",temp);
    }
    return 0;
}


你可能感兴趣的:(编程,算法,百度,Google,ACM)