首页 > 技术文章 > POJ1284 Primitive Roots [欧拉函数,原根]

cytus 2018-07-11 20:01 原文

  题目传送门

Primitive Roots
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 5434   Accepted: 3072

Description

We say that integer x, 0 < x < p, is a primitive root modulo odd prime p if and only if the set { (xi mod p) | 1 <= i <= p-1 } is equal to { 1, ..., p-1 }. For example, the consecutive powers of 3 modulo 7 are 3, 2, 6, 4, 5, 1, and thus 3 is a primitive root modulo 7. 
Write a program which given any odd prime 3 <= p < 65536 outputs the number of primitive roots modulo p. 

Input

Each line of the input contains an odd prime numbers p. Input is terminated by the end-of-file seperator.

Output

For each p, print a single number that gives the number of primitive roots in a single line.

Sample Input

23
31
79

Sample Output

10
8
24

 


  分析:

  一句话题意:求原根的个数。

  首先,如果知道原根的相关知识,那就可以直接上欧拉函数的板子了。关于原根的知识,请参考这里

  Code:

//It is made by HolseLee on 11th July 2018
//POJ 1284
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<iomanip>
using namespace std;
const int N=1e5+7;
int n,phi[N],top,q[10007];
bool vis[N];
void ready()
{
  phi[1]=1;
  for(int i=2;i<N;i++){
    if(!vis[i])phi[q[++top]=i]=i-1;
    for(int j=1,k;j<=top&&(k=i*q[j])<N;j++){
      vis[k]=true;
      if(i%q[j])phi[k]=phi[i]*(q[j]-1);
      else {phi[k]=phi[i]*q[j];break;}
    }
  }
}
int main()
{
  ios::sync_with_stdio(false);
  ready();
  while(cin>>n){
    printf("%d\n",phi[n-1]);}
  return 0;
}

 

 

 

 

推荐阅读