欧拉定理及其扩展の模板

扩展欧拉定理

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

ll a,b,m,phi;
string s;

ll calc_phi(ll x){
	ll ret=x;
	for(int i=2;i<=sqrt(x);i++){
		if(x%i==0){
			ret=ret/i*(i-1);
			while(x%i==0)x/=i;
		}
	}
	if(x>1)
		ret=ret/x*(x-1);
	return ret;
}
ll calc_b(){
	ll ret=0;
	bool k=0;
	for(int i=0;i<s.size();i++){
		ret=ret*10+s[i]-'0';
		if(ret>=phi)
			k=1;
		ret%=phi;
	}
	if(k)
		ret+=phi;
	return ret;
}
ll fpow(ll x,ll y,ll z){
	ll ret=1%z;
	for(;y;y>>=1,x=x*x%z)
		if(y&1)
			ret=ret*x%z;
	return ret;
}

int main(){
	scanf("%lld%lld",&a,&m);
	cin>>s;
	phi=calc_phi(m);
	b=calc_b();
	printf("%lld\n",fpow(a%m,b,m));
	return 0;
}

\(aka\) \(P5091\) 的答案

欧拉定理

LL euler_phi(LL n){
    LL ans=n,i;
    for(i=2; i<=sqrt(n); i++){
        if(n%i==0){
            ans=ans/i*(i-1);
            while(n%i==0)
            	n=n/i;
        }
    }
    if(n>1)
    	ans=ans/n*(n-1);
    return ans;
}
posted @ 2021-07-14 20:00  BFNewdawn  阅读(34)  评论(0编辑  收藏  举报