简、易-sachinKung

导航

PKU 1845 求因子和 二分

#include<iostream>

#include<stdio.h>

#include<stdlib.h>

using namespace std;

bool isp[8005];

int prime[1010];

int A,B;

void getpri()

{

     int i,k,t;

     for(i=0;i<=8000;i+=2)isp[i]=0;

     for(i=1;i<=8000;i+=2)isp[i]=1;

     isp[1]=0;isp[2]=1;

     for(i=3;i<=100;i+=2)

        if(isp[i])

        {

            t=i+i;k=t+i;

            while(k<=8000){isp[k]=0;k+=t;}

        }

     prime[1]=2;k=1;

     for(i=3;i<=8000;i+=2)

        if(isp[i])prime[++k]=i;

     prime[0]=k;

}

const int m=9901;

int pmod(int a,__int64 b)

{

    if(b==1)return a%m;

    int ans=1;

    while(b)

    {

         if(b&1)ans=(ans*a)%m;

         a=(a*a)%m;

         b=b>>1;

    }

    return ans;

}

int dfs(int p ,__int64 k)

{

    if(k==0)return 1;

    int c=dfs(p,(k-1)>>1);

    int d;

    d=pmod(p,(k>>1)+1);

    if(k&1)

          c=(c+c*d)%m;

    else

    {

        int d1=pmod(p,k>>1);

        c=(c+c*d)%m;

        c=(c+d1)%m;

    }

    return c;

}

void slove(int n)

{

     int i,k=0;

     int sum=1,s;

     for(i=1;i<=prime[0];i++)

     {

         s=0;

         while(n%prime[i]==0){n/=prime[i];s++;}

         if(s>0){sum=(sum*dfs(prime[i]%m,s*B))%m;}

         if(n==1)break;

         if(n/prime[i]<prime[i]){sum=(sum*dfs(n%m,B))%m;n=1;break;}

     }

     if(n>1)sum=(sum*dfs(n%m,B))%m;

     printf("%d\n",sum%m);

}

int main()

{

    getpri();

    while(scanf("%d%d",&A,&B)!=EOF)

    {if(A==0){printf("0\n");continue;}

         slove(A);

    }

    return 0;

}

posted on 2012-09-18 21:28  sachinKung  阅读(110)  评论(0编辑  收藏  举报