题目背景
出题人也想写有趣的题面,可惜并没有能力。
题目描述
给你三个正整数,a,m,ba,m,b,你需要求:a^b \bmod mabmodm
输入格式
一行三个整数,a,m,ba,m,b
输出格式
一个整数表示答案
输入输出样例
输入 #1复制
2 7 4输出 #1复制
2输入 #2复制
998244353 12345 98765472103312450233333333333输出 #2复制
5333说明/提示
注意输入格式,a,m,ba,m,b 依次代表的是底数、模数和次数
【样例 11 解释】
2^4 \bmod 7 = 224mod7=2
#include<stdio.h>
#define ll long long
#include<string.h>
char b[20000001];
ll pow(ll a,ll x,ll mod){
ll res=1;
while(x){
while(x%2==0){
a=(a*a)%mod;
x/=2;
}
res=(res*a)%mod;
x--;
}
return res;
}
ll gcd(ll x,ll y){
return x%y==0?y:gcd(y,x%y);
}
ll euler(ll n){
ll res=n,b=n,i;
for(i=2;i*i<=b;i++){
if(b%i==0){
res=res/i*(i-1);
while(b%i==0)
b/=i;
}
}
if(b!=1) res=res/b*(b-1);
return res;
}
int main(){
ll a,m,e,d=0,n,f=1,i,t;
scanf("%lld%lld%s",&a,&m,&b);
n=strlen(b);
e=euler(m);
for(i=0;i<n;i++){
t=d*10+(b[i]-'0');
d=t%e;
if(f&&t/e>=1) f=0;
}
if(gcd(a,m)==1){
printf("%lld",pow(a,d,m));
}else if(f){
printf("%lld",pow(a,d,m));
}else{
printf("%lld",pow(a,d+e,m));
}
return 0;
}