JZOJ5809 数羊

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 }
View Code

 

 
posted @ 2018-08-15 07:54  kasiruto  阅读(60)  评论(0编辑  收藏