poj 1284 求原根

来源:互联网 发布:mysql事物隔离级别 编辑:程序博客网 时间:2024/05/29 14:57
题目大意:给出一个奇素数,求出他的原根的个数,定义n的原根x满足条件0<x<n,并且有集合{ (xi mod n) | 1 <= i <=n-1 } 和集合{ 1, ..., n-1 }相等


关于这道题。如果知道欧拉函数的话,看出的答案是phi(n-1)其实也不难


定理:如果p有原根,则它恰有φ(φ(p))个不同的原根,p为素数,当然φ(p)=p-1,因此就有φ(p-1)个原根


直接用euler打表:


#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<algorithm>#include<map>using namespace std;const int maxn = 100000 + 10;#define INF 0x3f3f3f3f#define clr(x,y) memset(x,y,sizeof x )typedef long long ll;#define eps 10e-10const ll Mod = 1000000007;typedef pair<ll, ll> P;int euler[maxn];void Init(){    euler[1] = 1;    for(int i = 2; i < maxn; i ++)        euler[i] = i;    for(int i = 2; i < maxn; i ++)        if(euler[i] == i)        for(int j = i ; j < maxn; j += i)        euler[j] = euler[j] /i *(i - 1);}int main(){    int n;    Init();    while( ~ scanf("%d",&n))    {        printf("%d\n",euler[n -1]);    }    return 0;}