【模板】欧拉定理(洛谷P5091)

https://ouuan.blog.luogu.org/solution-p5091

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int b[20000004],cnt=0,flag=0;
inline int phi(int p){
    int ans=p;
    int m=sqrt(p);
    for(int i=2;i<=m;i++){
        if(p%i==0){
            ans=ans/i*(i-1);
            while(p%i==0) p/=i;
        }
    }
    if(p>1) ans=ans/p*(p-1);
    return ans;
}
inline int mo(int h){
    long long ans=0;
    for(int i=1;i<=cnt;i++){
        ans=(long long)10*ans+b[i];
        if(ans>=h){
            flag=1;
            ans%=h;
        }
    }
    return ans;
}
inline int ksm(long long  a,int c,int p){
    long long ans=1;
    while(c){
        if(c&1) ans=ans*a%p;
        a=a*a%p;
        c>>=1;
    }
    return ans;
}
int main(){
    int a,p;
    scanf("%d",&a);
    scanf("%d",&p);
    char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch<='9'&&ch>='0'){
        b[++cnt]=ch-48;
        ch=getchar();
    }
    int h=phi(p);
    int c=mo(h);
    if(flag) c+=h;
    cout<<ksm(a,c,p);
}

猜你喜欢

转载自www.cnblogs.com/wifimonster/p/10206846.html