Description
牧羊人A和牧羊人B总是很无聊,所以他们要玩一个游戏。A有a只羊,B有b只羊。他们想要知道a^b的因子和是多少。这就很为难两个牧羊人了,由于答案太大,你能不能告诉我答案取模9901的数。
Input
仅一行,为两个正整数a和b
Output
a^b的因子和对9901的余数。
Sample Input
2 3
Sample Output
15
Data Constraint
对于100%的数据,0≤a,b≤50000000
Solution
试除法,暴力加上奇怪的方法再加o2就能卡过。
1 %:pragma GCC optimize(2) 2 %:pragma GCC optimize("unroll-loops") 3 #include<cstdio> 4 #include<cmath> 5 #define N 9901 6 using namespace std; 7 int a,b,sum,l,t[1000]; 8 int main() 9 { 10 freopen("sheep.in","r",stdin); 11 freopen("sheep.out","w",stdout); 12 scanf("%d%d",&a,&b); 13 l=1; 14 sum=1; 15 if (!(a&1)) { 16 int p=0; 17 for (;!(a&1);) { 18 a>>=1; 19 p+=b; 20 } 21 t[1]=3; 22 int k=1,c=1; 23 for (register int y=2,e;k<<1<=p;e=t[c]-y,t[++c]=(t[c-1]*y+e)%N,y=(y*y)%N,k<<=1); 24 for (register int j=k+1;j<=p;++j){ 25 t[c]=t[c]<<1|1; 26 if (t[c]>N) 27 t[c]%=N; 28 } 29 sum=(sum*t[c])%N; 30 } 31 for (int i=3;i<=a;i+=2) 32 if (!(a%i)) 33 { 34 int p=0; 35 for (;a%i==0;) { 36 a=a/i; 37 p+=b; 38 } 39 t[1]=i+1; 40 int k=1,c=1; 41 for (register int y=i,e;k<<1<=p;e=t[c]-y,t[++c]=(t[c-1]*y+e)%N,y=(y*y)%N,k<<=1); 42 for (register int j=k+1;j<=p;j++){ 43 t[c]=t[c]*i+1; 44 if (t[c]>N) t[c]%=N; 45 } 46 sum=(sum*t[c])%N; 47 } 48 printf("%d",sum); 49 }