51Nod 1135 - 原根(数论)

【题目描述】
在这里插入图片描述
【思路】
一个素数 pp 的原根有 p1p-1 个,求解方法是对 p1p-1 进行唯一分解,设 p1=p1a1p2a2...pnanp-1=p_1^{a_1}p_2^{a_2}...p_n^{a_n},则对于一个数 gggg 是模 pp 原根的充要条件是 gp1pi1 (mod 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;
}
posted @ 2019-01-20 22:02  不想吃WA的咸鱼  阅读(168)  评论(0编辑  收藏  举报