• 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
    
    
  • 相关阅读:
    .Net Core小技巧
    调用Kubernetes API操作Kubernetes
    在CentOS 7+ 安装Kubernetes入门(单Master)
    Linux命令行基础
    使用wireshark学习TCP
    Redis原子性写入HASH结构数据并设置过期时间
    Vue使用小结
    JAVA & .NET创建对象构造函数调用顺序
    .NET 中的序列化 & 反序列化
    ASP.NET Core中使用Graylog记录日志
  • 原文地址:https://www.cnblogs.com/TYH-TYH/p/9378647.html
Copyright © 2020-2023  润新知