欧拉定理

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<iostream>
using namespace std;
long long a,m,b;
long long read(long long m){
    register long long x=0,f=0;
	char ch=getchar();
    while(!isdigit(ch)){
		ch=getchar();
	}
    while(isdigit(ch)){
        x=x*10+ch-'0';
        if(x>=m){
			f=1;
		}
        x%=m;
		ch=getchar();
    }
    return x+(f==1?m:0);
}
long long phi(long long n){
    long long ans=n,m=sqrt(n);
    for(long long i=2;i<=m;i++){
        if(n%i==0){
            ans=ans/i*(i-1);
            while(n%i==0){
				n/=i;
			}
        }
    }
    if(n>1){
		ans=ans/n*(n-1);
	}
    return ans;
}
long long fast_pow(long long a,long long b,long long p){
    long long ret=1;
    for(;b;b>>=1,a=a*a%p){
        if(b&1){
			ret=ret*a%p;
		}
	}
    return ret;
}
int main(){
    scanf("%lld%lld",&a,&m);
    b=read(phi(m));
    printf("%lld\n",fast_pow(a,b,m));
    return 0;
}
posted @ 2019-08-03 22:04  prestige  阅读(242)  评论(0编辑  收藏  举报