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) 编辑 收藏 举报