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

 

 

转载于:https://www.cnblogs.com/Tokisaki-Kurumi/p/9479255.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值