【模板】扩展欧拉定理
题目背景
出题人也想写有趣的题面,可惜并没有能力。
题目描述
给你三个正整数, a , m , b a,m,b a,m,b,你需要求: a b m o d m a^b \bmod m abmodm
输入格式
一行三个整数, a , m , b a,m,b a,m,b
输出格式
一个整数表示答案
样例 #1
样例输入 #1
2 7 4
样例输出 #1
2
样例 #2
样例输入 #2
998244353 12345 98765472103312450233333333333
样例输出 #2
5333
提示
注意输入格式, a , m , b a,m,b a,m,b 依次代表的是底数、模数和次数
【样例
1
1
1 解释】
2
4
m
o
d
7
=
2
2^4 \bmod 7 = 2
24mod7=2
【数据范围】
对于
100
%
100\%
100% 的数据,
1
≤
a
≤
1
0
9
1\le a \le 10^9
1≤a≤109,
1
≤
b
≤
1
0
20000000
,
1
≤
m
≤
1
0
8
1\le b \le 10^{20000000},1\le m \le 10^8
1≤b≤1020000000,1≤m≤108。
#include<iostream>
using namespace std;
using ll=long long ;
int flag;
ll phi(int n){
ll res=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
while(n%i==0)n/=i;
res=res/i*(i-1);
}
}
if(n>1)res=res/n*(n-1);
return res;
}
ll depow(string s,ll p){
ll b=0;
for(int i=0;i<s.length();i++){
b=b*10+(s[i]-'0');
if(b>=p)flag=1,b%=p;
}
if(flag)b=b+p;
return b;
}
ll qmi(int a,ll b,int p){
ll res=1;
while(b){
if(b&1)res=res*a%p;
a=1ll*a*a%p;
b>>=1;
}
return res;
}
int main() {
int a,m;cin>>a>>m;
ll ph=phi(m);
string bb;cin>>bb;
ll b=depow(bb,ph);
cout<<qmi(a,b,m)<<'\n';
}