poj_1284_原根

一开始看题的时候第一想法就是暴力,但是无奈数据量有点大,看了题解之后才知道原来牵扯到数论上的一个叫做原根的东西,这个题的题意就是,给你一个奇素数,问题他的原根有多少,根据初等数论上所说,此时牵扯到了三个定理。

1)所有的单素数都是有原根的

2)一个数n有原根,那么他有phi(phi(n))个模n不同余的原根(n是否素数都可用)

3)一个素数有原根,则有phi(n-1)个原根

其中3是由1,2简单推得,那么之后这道题就很简单了。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <cmath>
#include <queue>
#include <map>
using namespace std;
#define MAX(x,y) (((x)>(y))?(x):(y))
#define MIN(x,y) (((x)<(y))?(x):(y))
#define N 500010
#define pi acos(-1.0)
#define inf 100000000
typedef long long ll;
typedef unsigned long long ull;
int phi[N];
void phi_table(int n){                     //欧拉打表
    for(int i=2;i<=n;i++) phi[i]=0;
    phi[1]=1;
    for(int i=2;i<=n;i++){
        if(!phi[i])
          for(int j=i;j<=n;j+=i){
              if(!phi[j]) phi[j]=j;
              phi[j]=phi[j]/i*(i-1);
          }
    }
}

int main(){
    phi_table(70000);
    int n;
    while(scanf("%d",&n)==1){
        printf("%d\n",phi[phi[n]]);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-02 00:41:50

poj_1284_原根的相关文章

HDU5478 原根求解

看别人做的很简单我也不知道是怎么写出来的 自己拿到这道题的想法就是模为素数,那必然有原根r ,将a看做r^a , b看做r^b那么只要求出幂a,b就能得到所求值a,b 自己慢慢化简就会发现可以抵消n然后扩展欧几里得解决,一个个枚举所有模的情况.... 中间利用了欧拉准则可以知道 对所有奇素数而言: a^((p-1)/2) = -1(mod p) 利用上述准则,这样就不用baby_step giant_step的办法了 1 #include <bits/stdc++.h> 2 using nam

POJ1284---Primitive Roots(求原根个数, 欧拉函数)

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 t

URAL 1268. Little Chu 求最大原根

题目来源:URAL 1268. Little Chu 题意:输入n 求一个最大的k 使得k^1 k^2 k^3...k^x mod n 后各不相同 思路:mod n 后各不相同 最多有 n个 那么此事k就是原根 因为k <= n 所以从n开始向下枚举 求一个最大的原根 #include <cstdio> #include <cstring> using namespace std; typedef long long LL; int p[100000], c; LL pow_

hdu4992 Primitive Roots(所有原根)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4992 题意:给出n,输出n的所有原根. 思路:求出n的一个原根x,那么对于所以的i,i<phi(n)且(i,phi(n))=1,x^i%n都是n的原根. int Euler(int n) { int i,ans=n; for(i=2;i*i<=n;i++) if(n%i==0) { ans=ans/i*(i-1); while(n%i==0) n/=i; } if(n>1) ans=ans/

[学习笔记]原根

欧拉定理 若$a,p\;\in\;N^{+},(a,p)=1$,则$a^\phi(p)\;\equiv\;1(mod\;p)$. 阶 使得$a^x\;\equiv\;1(mod\;p)$的最小正整数$x$称为$a$模$p$的阶,记为$ord_pa$. 实现 找一个数的阶可以暴力求解,原根为$\phi(p)$的因数. 例题 yayamao的神题. 原根 原根:$ord_pa=\phi(p)$时,称$a$是$p$的原根. $a^1,a^2,...,a^{\phi(p)}$在模p意义下互不相同. 如果

51nod 1135 原根

定义:设,,使得成立的最小的,称为对模的阶,记为. 定理:如果模有原根,那么它一共有个原根. 定理:若,,,则. 定理:如果为素数,那么素数一定存在原根,并且模的原根的个数为. 定理:设是正整数,是整数,若模的阶等于,则称为模的一个原根. 假设一个数对于模来说是原根,那么的结果两两不同,且有,那么可以称为是模的一个原根,归根到底就是当且仅当指数为的时候成立.(这里是素数) 模有原根的充要条件:,其中是奇素数. 求模素数原根的方法:对素因子分解,即是的标准分解式,若恒有 成立,则就是的原根.(对于

[POJ1284]Primitive Roots(原根性质的应用)

题目:http://poj.org/problem?id=1284 题意:就是求一个奇素数有多少个原根 分析: 使得方程a^x=1(mod m)成立的最小正整数x是φ(m),则称a是m的一个原根 然后有这样的定理: 1.所有奇素数都有原根 2.如果一个数n有原根,那么原根个数为φ(φ(n)) 由性质2就可知道,对于此题的奇素数n,结果就是φ(n-1)

hdu--4861--费马小定理&amp;&amp;素数的原根

可以用打表找规律过这题.  但这显然不是这题的初衷. 题意很简单 其实就是判断  var = ( 1^i + 2^i + ... + (p-1)^i ) ( mod p )//很重要的一个初始条件:p是素数 首先 你一定要知道费马小定理. 假如p是素数 并且p不整除a 那么 a^(p-1)≡1( mod p) <因为我这边没好的数学公式编辑器 我只能用文字来描述一些东西 > 我们发现 上面 var的式子中 下标值是从1-(p-1) 就满足了上面关于a的要求 那么当(p-1)|i 即(p-1)整

poj1284:欧拉函数+原根

何为原根?由费马小定理可知 如果a于p互质 则有a^(p-1)≡1(mod p)对于任意的a是不是一定要到p-1次幂才会出现上述情况呢?显然不是,当第一次出现a^k≡1(mod p)时, 记为ep(a)=k 当k=(p-1)时,称a是p的原根每个素数恰好有f(p-1)个原根(f(x)为欧拉函数) 定理:对于奇素数m, 原根个数为phi(phi(m)), 由于phi(m)=m-1, 所以为phi(m-1).某大牛的证明: {xi%p | 1 <= i <= p - 1} = {1,2,...,p