51Nod 1135 - 原根(数论)

【题目描述】
在这里插入图片描述
【思路】
一个素数 p p 的原根有 p 1 p-1 个,求解方法是对 p 1 p-1 进行唯一分解,设 p 1 = p 1 a 1 p 2 a 2 . . . p n a n p-1=p_1^{a_1}p_2^{a_2}...p_n^{a_n} ,则对于一个数 g g g g 是模 p p 原根的充要条件是 g p 1 p i 1   ( m o d   p ) g^{\frac{p-1}{p_i}} \neq 1 \ (mod \ p)

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

int mod;
int fac[100005],cnt;

ll pw(ll x,ll n){
	ll ans=1;
	while(n){
		if(n&1) ans=ans*x%mod;
		x=x*x%mod;
		n>>=1;
	}
	return ans;
}

int main(){
	scanf("%d",&mod);
	int x=mod-1,m=sqrt(x)+0.5;
	for(int i=2;i<=m;++i){
		if(x%i==0) fac[cnt++]=i;
		while(x%i==0) x/=i;
	}
	if(x>1) fac[cnt++]=x;	
	for(int g=2;g<mod;++g){
		bool ok=true;
		for(int j=0;j<cnt;++j){
			if(pw(g,(mod-1)/fac[j])==1){
				ok=false;
				break;
			}
		}
		if(ok){
			printf("%d\n",g);
			break;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xiao_k666/article/details/86567010