数论:扩展欧拉定理

#include<cstdio>
#include<stack>
#include<iostream>
#include<queue>
#include<algorithm>
#include<iterator>
#include<set>
#include<string>
#include<cstring> 
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
int a,m;
long long b=0;
ll fastpow(ll a,ll pow,ll mod){
    
    
	long long base=a;
	long long ans=1;
	while(pow){
    
    
		if(pow&1){
    
    
			ans=(ans*base)%mod;
		}
		base=(base*base)%mod;
		pow>>=1;
	}
	return ans;
}//快速幂板子 
int phi=1;
bool flag=false;
char c;
int main(){
    
    
	scanf("%d%d",&a,&m);
	a%=m;
	int mm=m;//求pow(a,b)%m
	for(int i=2;i*i<=mm;++i) {
    
    //其中a<1e9,b<pow(10,2e8),m<1e8  
		if(mm%i) continue;
		phi*=i-1;
		mm/=i;
		while(mm%i==0)
			phi*=i,
		mm/=i;
	}
	if (mm > 1) phi *= mm - 1;
	while ( ( c = getchar() ) < '0' || c > '9') ;
	while (b = b * 10 + (c - '0'), (c = getchar()) >= '0' && c <= '9')
		if (b >= phi) flag = 1, b %= phi;
	if (b >= phi) flag = 1, b %= phi;
	if (flag) b += phi;
	printf("%d",fastpow(a,b,m));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45695839/article/details/109556471