题目链接 : 传送门
题目大意: 求一个质数的原根个数。
先普及一下原根的定义:
设m是正整数,a是整数,若a模m的阶等于euler(m),则称a为模m的一个原根。
eg: m=7,euler(7) = 6(1,2,3,4,5,6)
则:
#include<iostream> #include<stdio.h> using namespace std; //直接求解欧拉函数,返回euler(n) int euler(int n){ int res=n,a=n; for(int i=2;i*i<=a;i++) { if(a%i==0) { res=res/i*(i-1); //先进行除法是为了防止中间数据的溢出 while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; } int main () { int num; while(~scanf("%d",&num)) { printf("%d\n",euler(num-1)); } }
poj 1284 Primitive Roots 【原根】【数论】,布布扣,bubuko.com
poj 1284 Primitive Roots 【原根】【数论】
原文地址:http://blog.csdn.net/u010468553/article/details/38368643