码迷,mamicode.com
首页 > 编程语言 > 详细

指数取模算法

时间:2017-10-02 16:15:42      阅读:440      评论:0      收藏:0      [点我收藏+]

标签:space   cin   pac   turn   clu   cout   div   输出   color   

题目:

给定a,b

求出:a^a^a....^a(b个a)

输入:

a ,b

输出

运算结果

样例:

2 3

输出:16

范围:a,b<=10^9

 

我们首先可以得到答案的式子:ans=a^(a^(b-1))

然而(a^(b-1))作为指数太大了,必须取模

令y=(a^(b-1)),p=1e9+7

y=k*φ(p)+(y%φ(p))

因为x^φ(p)Ξ1(mod p)

所以a^φ(p)%p=1

所以a^y=a^(y%φ(p))

因为p是素数,所以φ(p)=p-1

所以将a^(b-1)模p-1

用快速幂就可以了

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 int Mod=1000000007;
 7 long long a,b,ans,s;
 8 long long qpow(long long x,int y,int mo)
 9 {
10   long long res=1;
11   while (y)
12     {
13       if (y&1) res=(res*x)%mo;
14       x=(x*x)%mo;
15       y>>=1;
16     }
17   return res;
18 }
19 int main()
20 {
21   cin>>a>>b;
22   s=qpow(a,b-1,Mod-1);
23   ans=qpow(a,s,Mod);
24   cout<<ans;
25 }

 

指数取模算法

标签:space   cin   pac   turn   clu   cout   div   输出   color   

原文地址:http://www.cnblogs.com/Y-E-T-I/p/7620217.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!