zoukankan      html  css  js  c++  java
  • POJ 1284 Primitive Roots

    Primitive Roots
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 5481   Accepted: 3101

    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
    
    我觉得丧心病狂的是读了很久题才看懂意思(英语太渣了。。)再一看题目,原根。。好吧,就当进一步理解原根了吧。
    原根定义:设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)
    假设一个数g是P的原根,那么g^i mod P的结果两两不同,且有 1< g< P, 0< i < P,归根到底就是g^(P-1) = 1 (mod P)当且仅当指数为P-1的时候成立.(这里P是素数).
    简单来说,g^i mod p ≠ g^j mod p (p为素数)
    其中i≠j且i, j介于1至(p-1)之间
    则g为p的原根。
    用两次欧拉函数就ok了。
     1 #include <cstdlib>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <algorithm>
     5 #include<iostream>
     6 #include <cmath>
     7 #include<string>
     8 #define ll long long 
     9 #define dscan(a) scanf("%d",&a)
    10 #define mem(a,b) memset(a,b,sizeof a)
    11 using namespace std;
    12 #define MAXL 1105
    13 #define Endl endl
    14 #define maxn 1000005
    15 ll x,y;
    16 inline ll read()
    17 {
    18     ll x=0,f=1;char ch=getchar();
    19     while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
    20     while(ch>='0'&&ch<='9') {x=10*x+ch-'0';ch=getchar();}
    21     return x*f;
    22 }
    23 int euler(int n)
    24 {
    25      int i;
    26      int res = n,a = n;
    27      for(i = 2;i*i <= a; ++i)
    28      {
    29          if(a%i == 0)
    30          {
    31              res -= res/i; 
    32              while(a%i == 0) a/=i;
    33          }
    34      }
    35      if(a > 1) res -= res/a;
    36      return res;
    37 }
    38 int main()
    39 {
    40     int n;
    41     while(cin>>n)
    42     {
    43        cout<<euler(euler(n))<<endl;
    44     }
    45     return 0;
    46 }
    View Code
    
    
  • 相关阅读:
    【NS2仿真】TCP协议
    【NS2仿真】UDP协议
    windows pip 安装 whl文件
    数据预处理
    记录一次gitbush 在windows上的使用
    记一次Linux向服务器传war过程
    Java 字符串String(一)拆分
    web基础知识(三)关于ajax,Jquery传值最基础东西
    web基础知识(二)关于ajax,Jquery传值最基础东西
    web基础知识(一)关于ajax传值最基础东西
  • 原文地址:https://www.cnblogs.com/TYH-TYH/p/9378647.html
Copyright © 2011-2022 走看看