P5091-扩展欧拉定理板子

P5091

代码

#include
#define int long long
using namespace std;
int mod=1,a,b,n,flag;
int read(){
	int f=1,re=0;
	char ch;
	for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
	if(ch=='-'){f=-1,ch=getchar();}
	for(;isdigit(ch);ch=getchar()){
		re=(re<<3)+(re<<1)+ch-'0';
		if(re>=mod) flag=1; 
		re%=mod;
	}return re*f;
} 
int ksm(int a,int b){
	int ans=1;
	while(b){
		if(b&1) ans=ans*a%n;
		a=a*a%n;
		b>>=1;
	}return ans;
}
//int get_phi(){
//	if(n==1) return 0;
//	phi[1]=1;
//	for(int i=2;i<=n;i++){
//		if(!vis[i]){
//			vis[i]=i;
//			prime[++cnt]=i;
//			phi[i]=i-1;
//		}
//		for(int j=1;j<=cnt;j++){
//			if(prime[j]*i>n) break;
//			vis[prime[j]*i]=prime[j];
//			if(i%prime[j]==0){//i与prime[j]不互质,也就是这个合数的所有质因子都在i里出现过 
//				phi[i*prime[j]]=phi[i]*prime[j];
//				break;
//			}phi[i*prime[j]]=phi[i]*phi[prime[j]];
//		}
//	}return phi[n];
//}
void getphi1(){//求单个欧拉函数的方法1
	int m=n;
	for(int i=2;i*i<=m;i++){ 
		if(m%i) continue; 
		mod*=(i-1),m/=i;
		while(m%i==0) mod*=i,m/=i;//保证枚举的i一定为质数 
	}if(m>1) mod*=m-1;
}
void getphi2(){//求单个欧拉函数的方法2
	int m=n;mod=n;
	for(int i=2;i*i<=m;i++){
		if(m%i) continue;
		mod=mod/i*(i-1);
		while(m%i==0) m/=i;
	}if(m>1) mod=mod/m*(m-1);
}
signed main(){
	scanf("%lld%lld",&a,&n); 
	a%=n;
	getphi2(),b=read();
	if(flag) b+=mod;
	printf("%lld\n",ksm(a,b));
	return 0;
}

你可能感兴趣的:(数论)