【模板】扩展欧拉定理

题目大意:求$$a^b\ mod \ m$$

题解:
扩展欧拉定理成立的条件是 \(b\ge \varphi (m)\)
注意:质因数分解尽量传递值到函数内部,否则分解过程中会对原来的值进行修改,容易出现奇怪的错误。

代码如下

#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 f=0;
	for(int i=0;i<s.size();i++){
		ret=ret*10+s[i]-'0';
		if(ret>=phi)f=1;
		ret%=phi;
	}
	if(f)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(){
	cin>>a>>m>>s;
	phi=calc_phi(m);
	b=calc_b();
	printf("%lld\n",fpow(a%m,b,m));
	return 0;
}
posted @ 2019-03-22 09:35  shellpicker  阅读(360)  评论(0编辑  收藏  举报