天天看点

扩展欧拉定理降幂

【模板】扩展欧拉定理

扩展欧拉定理降幂
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int getphi(int n)
{
	int ans=n;
	for(int i=2; i*i<=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;
}
int qpow(int a,int b,int mod)
{
	int ans=1;
	a=a%mod;
	while(b)
	{
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;
		b=b>>1;
	}
	return ans%mod;
}
signed main()
{
	int a,m;
	string b;
	cin>>a>>m;
	cin>>b;
	int c=0;
	int phi=getphi(m);
	bool fg=0;
	for(int i=0; i<b.size(); i++)
	{
		c=c*10+b[i]-'0';
		if(c>=phi)fg=1;//  >=时要加上phi 
		c=c%phi;
	}
	int ans=0;
	if(fg)ans=qpow(a,c+phi,m);
	else ans=qpow(a,c,m);
	cout<<ans<<"\n";
}

           

继续阅读