HDU 2619 完全剩余类 原根

求有多少$i(<=n-1)$,使 $x^i  \mod n$的值为$[1,n-1]$,其实也就是满足完全剩余类的原根数量。之前好像在二次剩余的讲义PPT里看到这个过。

直接有个定理,如果模k下有原根,那么其原根总数为$\varphi(\varphi(k))$

/** @Date    : 2017-09-21 19:22:16
  * @FileName: HDU 2619 原根 完全剩余类.cpp
  * @Platform: Windows
  * @Author  : Lweleth ([email protected])
  * @Link    : https://github.com/
  * @Version : $Id$
  */
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8;

LL pri[N];
int vis[N];
int c = 0;

void prime()
{
	MMF(vis);
	for(int i = 2; i < N; i++)
	{
		if(!vis[i]) pri[c++] = i;
		for(int j = 0; j < c && i * pri[j] < N; j++)
		{
			vis[i * pri[j]] = 1;
			if(i % pri[j] == 0)	 break;
		}
	}
}

LL get_phi(LL x)
{
	LL res = x;
	for(LL i = 0; i < c && pri[i] <= x / pri[i]; i++)
	{
		if(x % pri[i] == 0)
		{
			while(x % pri[i] == 0)
				x /= pri[i];
			res = res / pri[i] * (pri[i] - 1);
		}
	}
	if(x > 1)
		res = res / x * (x - 1);
	return res;
}

int main()
{
	prime();
	LL n;
	while(cin >> n) cout << get_phi(get_phi(n)) << endl;
    return 0;
}
//https://zh.wikipedia.org/wiki/%E5%8E%9F%E6%A0%B9
//对正整数 {\displaystyle (a,m)=1} (a,m)=1,
//如果 a 是模 m 的原根,那么 a 是整数模m乘法群(即加法群 Z/mZ 的可逆元,
//也就是所有与 m 互素的正整数构成的等价类构成的乘法群)Zm×的一个生成元。
//由于Zm×有 {\displaystyle \varphi (m)} \varphi (m)个元素,
//而它的生成元的个数就是它的可逆元个数,即 {\displaystyle \varphi (\varphi (m))} \varphi (\varphi (m))个,
//因此当模 {\displaystyle m} m有原根時,它有 {\displaystyle \varphi (\varphi (m))} \varphi (\varphi (m))個原根。
时间: 2024-07-28 17:06:55

HDU 2619 完全剩余类 原根的相关文章

2^x mod n = 1 HDU - 1395(欧拉定理 原根)

2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 20711    Accepted Submission(s): 6500 Problem Description Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1. Inp

原根二连 HDU 4992 &amp;&amp; poj 1284 Primitive Roots

原根存在的充要条件 n = 1,2,4,p^r (p为奇素数,r为任意正整数) 原根的性质 若n存在原根,则原根个数为φ(φ(n)) 若g是n的一个原根,则g^d是n的原根的充要条件为gcd(d,φ(n)) = 1 一个数的全体原根乘积模n余1 一个数的全体原根和模n余μ(n-1) #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using names

hdu 4992 Primitive Roots 【求原根模板】

题目链接 大题流程: 判定是否有原根->求出最小原根->利用最小原根找出全部原根 #include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxn=1e6+5; int prime[maxn+5]; bool check[maxn+5]; int phi[maxn+5]; int num_prime; void init() { memset(check, false, sizeof(

HDU 6051 If the starlight never fade(原根+推式子)

题目大意: 设\(f(i)\)为使\((x+y)^i \equiv x^i (mod\ p)\)成立的(x,y)的对数.其中\(1 \leq x \leq p-1 , 1\leq y\leq m\),m,p给定且p是一个质数.求\(\sum_{i=1}^{p-1}i*f(i)\),p<=1e9+7,m<=p-1 思路 我们考虑用原根去代换x,y. 设g为p的一个原根,\(g^a\equiv x(mod \ p),g^b \equiv y(mod \ p)\). 然后我们用\(g\)去代换\(x

HDU 4861 Couple doubi(数论)

HDU 4861 Couple doubi 题目链接 题意:给定k,p,有k个球,每个球的值为1^i+2^i+...+(p-1)^i (mod p) (1 <= i <= k),现在两人轮流取球,最后球的值总和大的人赢,问先手是否能赢 思路:先手不可能输,非赢即平,那么只要考虑每种球的值, 利用费马小定理或欧拉定理,很容易得到该函数的循环节为p - 1, 那么i如果为p - 1的倍数,即为循环节的位置,那么每个值都为1,总和为p - 1 如果i不在循环节的位置,任取一个原根g,根据原根的性质,

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/

【初等数论】 05 - 指数和原根

1. 指数 现在我们就开始为剩余系建立“坐标”,完全剩余系是连续的,剩余类本身就是很好的坐标,所以这里我们只需讨论既约剩余系.前面已经知道\((a,m)=1\)时,总存\(d\)在使得\(a^d\equiv 1\pmod{m}\),满足条件的最小的\(d_0=\delta_m(a)\)称为\(a\)对模\(m\)的阶或指数,也可简记为\(\delta(a)\).为了得到更进一步的结论,我们先整理一下指数的简单性质: (1)若\(a^d\equiv 1\pmod{m}\),则\(\delta_m(

转载:hdu 题目分类 (侵删)

转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092.1093. 1094.1095.1096.1097.1098.1106.1108.1157.116

N次剩余 (hdu 3930)

N次剩余 (hdu 3930) 任务: 给定N, a, p, 求出(x^N)%p=a 在模p意义下的所有解x. 说明: 令g为p的原根,因为p为素数,所以phi(p)=p-1. 由原根的性质得: 如果g为p的原根,则:g^i mod p != g^j mod p (p为素数), 其中i != j且i, j介於1至(p-1)之间 所以,可以设g^y=x, g^t=a,则有: g^(y*N)%p=g^t 又由原根的性质: g^(y*N)%p=g^t -> (y*N)%(p-1)=t (此方程可以由拓