欧拉函数

莫比乌斯反演欧拉函数杜教筛大总结

旧巷老猫 提交于 2019-12-09 12:34:04
莫比乌斯函数 定义 设 \(n=\prod_{i=1}^{k} p_i^{c_i}\) ,则 \(\mu(n)=(-1)^k\) ,特别地 \(\mu(1)=1\) 。 性质 最常用性质 \(\sum_{d|n}\mu(d)=[n=1]\) 反演性质 \(F(n)=\sum_{d|n}f(d) \Longleftrightarrow f(n)=\sum_{d|n}F(d)\mu(\frac{n}{d})\) \(F(n)=\sum_{n|d}f(d) \Longleftrightarrow f(n)=\sum_{n|d}F(d)\mu(\frac{d}{n})\) 常用性质 \(\sum_{i=1}^{n}\sum_{j=1}^{n}[gcd(i,j)=1]=\sum_{d=1}^{n}\mu(d)\lfloor\frac{n}{d}\rfloor \lfloor\frac{n}{d}\rfloor\) 欧拉函数 定义 设 \(n=\prod_{i=1}^{k}p_i^{c_i}\) ,有 \(\phi(n)=n\prod_{i=1}^{k}\frac{p_i-1}{p_i}\) 。 性质 最常用性质 \(\sum_{d|n}\phi(d)=n\) 零零散散的一些性质(没收集完) \(\phi(ab)=\frac{\phi(a)\phi(b)gcd(a,b)}{\phi(gcd(a

acwing 873. 欧拉函数 模板

我是研究僧i 提交于 2019-12-08 20:26:27
地址 https://www.acwing.com/problem/content/875/ 给定n个正整数ai,请你求出每个数的欧拉函数。 欧拉函数的定义 输入格式 第一行包含整数n。 接下来n行,每行包含一个正整数ai。 输出格式 输出共n行,每行输出一个正整数ai的欧拉函数。 数据范围 1≤n≤100, 1≤ai≤2∗109 输入样例: 3 3 6 8 输出样例: 2 2 4 题解 模板题 根据公式可得代码中注释部分的代码 然后避免出现分数 调整了计算次序 并做了一些通分 方便计算 #include <iostream> using namespace std; int phi(int x) { int res = x; for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) { res = res*(1-1/i); // = res*((i-1)/i) = res/i*(i-1) //res = res / i * (i - 1); //最终结果 while (x % i == 0) x /= i; } if (x > 1) res = res / x * (x - 1); return res; } int main() { int n; cin >> n; while (n -- ) { int x; cin >> x;

欧拉函数线性筛(模板)

☆樱花仙子☆ 提交于 2019-12-05 08:37:53
1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); 2 #include <cstdio>//sprintf islower isupper 3 #include <cstdlib>//malloc exit strcat itoa system("cls") 4 #include <iostream>//pair 5 #include <fstream>//freopen("C:\\Users\\13606\\Desktop\\Input.txt","r",stdin); 6 #include <bitset> 7 //#include <map> 8 //#include<unordered_map> 9 #include <vector> 10 #include <stack> 11 #include <set> 12 #include <string.h>//strstr substr strcat 13 #include <string> 14 #include <time.h>// srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9; 15 #include <cmath> 16 #include <deque> 17 #include <queue>/

数论_同余_欧拉函数_POJ3696_POJ3696_The Luckiest number

天涯浪子 提交于 2019-12-04 15:52:15
点此打开题目页面 思路分析: 设由x个8构成的x位数能够被L整除, d = gcd(L, 8), 则 , 分析知10与 互质. 引理: 若正整数a, n互质, 则满足 的最小正整数 为 的约数, 为欧拉函数. 证明从略: 因此只需枚举 的所有约数, 并使用快速幂检验即可, 需要注意的是快速幂计算乘法的中间结果会超出long long最大表示范围, 需单独写一个64位整数乘法的过程, 具体实现如下AC代码所示: //POJ3696_The Luckiest number #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> using namespace std; typedef long long ll; //返回(a * b) % mod的值 ll mul(ll a, ll b, ll mod){ ll res = 0; for(; b; b >>= 1, a = (a << 1) % mod) if(b & 1) res = (res + a) % mod; return res; } ll power(ll a, ll b, ll mod){ ll res = 1; for(; b; b >>= 1, a = mul(a, a, mod))

poj 3696 欧拉函数

岁酱吖の 提交于 2019-12-04 15:48:10
poj 3696 题意: 给出一个数字L,求出最短的888...8能被L整除,输出最短的长度。 限制: 1 <= L <= 2*10^9 思路: 设x为最小长度 888...8=(10^x-1)/9*8 由题意得: (10^x-1)/9*8 % L=0 -> (10^x-1)*8 % (9L) = 0 -> (10^x-1) % (9L/gcd(L,8)) = 0 -> 10^x % (9L/gcd(L,8)) = 1 这个是一个离散对数的问题,第一个想到的是用拓展BSGS做,但超时了。 因为余数为1 可以想到欧拉定理:a^phi(m) % m = 1 , 在a与m互质的条件下。 回到这道题: 在10 与 9L/gcd(L,8) 不互质的条件下,无解 在10 与 9L/gcd(L,8) 互质的条件下 求出tmp=phi(9L/gcd(L,8)),然后O(sqrt(tmp))枚举tmp的因子,选出最小的符合条件的因子就行了。 /*poj 3696 题意: 给出一个数字L,求出最短的888...8能被L整除,输出最短的长度。 限制: 1 <= L <= 2*10^9 思路: 设x为最小长度 888...8=(10^x-1)/9*8 由题意得: (10^x-1)/9*8 % L=0 -> (10^x-1)*8 % (9L) = 0 -> (10^x-1) % (9L/gcd(L,8))

AcWing 874. 筛法求欧拉函数

不问归期 提交于 2019-12-04 12:32:05
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6+10; int primes[N],cnt; int phi[N]; bool st[N]; ll get_eulers(int n) { phi[1]=1; for(int i=2; i<=n; i++) { if(!st[i]) { primes[cnt++]=i; phi[i]=i-1; } for(int j=0; primes[j]<=n/i; j++) { st[primes[j]*i]=true; if(i%primes[j]==0) { phi[primes[j]*i]=phi[i]*primes[j]; break; } phi[primes[j]*i]=phi[i]*(primes[j]-1); } } ll res=0; for(int i=1; i<=n; i++) { res+=phi[i]; } return res; } int main() { int n; cin>>n; cout<<get_eulers(n)<<endl; return 0; } 来源: https://www.cnblogs.com/QingyuYYYYY/p/11863760.html

欧拉函数、欧拉定理和费马小定理

三世轮回 提交于 2019-12-04 08:28:59
欧拉函数、欧拉定理和费马小定理 对于正整数n,欧拉函数是小于等于n的正整数中与n互质的数的数目,表示为φ(n)。 性质1:对于素数p,φ(p)=p-1。 性质2:对于两个互质数p,q,φ(pq)=φ(p)*φ(q)=(p-1)(q-1)。(积性函数)(易证) 性质3:若n是质数p的k次幂,φ(n)=p k -p k-1 =(p-1)p k-1 ,因为除了p的倍数外,其他数都跟n互质。 性质4: 因为:x可以分解成p1 q1 ×p2 q2 ×p3 q3 ……×pn qn (pi为x的质因数) 因为pi qi 两两互质,所以:φ(x)=φ(p1 q1 )×φ(p2 q2 )×φ(p3 q3 )……×φ(pn qn ) (性质2) 所以:φ(x)=(p1 q1 -p1 q1-1 )×(p2 q2 -p2 q2-1 )×(p3 q3 -p3 q3-1 )……×(pn qn -pn qn-1 ) (性质3) 提取x即得到公式。 性质5:n=Σφ(d|n) yu大有个牛逼的证法,把1到n的所有数除以n,变成n个既约分数,分母d只可能是n的约数。并且,以d为分母的分数个数正好是φ(d)。因此,分数总数n=Σφ(d|n)。 欧拉定理: 对于互质的正整数a和n,有 证明: ( 1 ) 令 Zn = {x1, x2, …, xφ(n)} (mod n), S = {a * x1, a * x2, …

【学习笔记】欧拉函数

房东的猫 提交于 2019-12-04 06:37:00
以下的除法,如果不是特殊说明,都是整数运算中的整除。 1 关于欧拉函数 \(\varphi\) \(\varphi(x)\) 是欧拉函数,表示的是 \([1,x]\) 中和 \(x\) 互质的数的个数。 \[ \varphi(x)=x\times \Pi_{p\in prime,p|x}(1-\frac 1p) \] 以上的证明:(用归纳证明) 设 \(p,q\in prime,p|x,q|x\) ,那么在 \([1,x]\) 中是 \(p\) 和 \(q\) 的倍数的个数分别为 \(\frac xp\) 和 \(\frac xq\) 。 那么存在于 \([1,x]\) 中是 \(p\) 或者 \(q\) 的倍数的个数为 \(\frac xp+\frac xq-\frac x{pq}\) 。(这一步用到了容斥原理) 那么 \(\varphi(x)\) 也就是和 \(p,q\) 同时不互质的数的个数为 \(x-\frac xp-\frac xq+\frac x{pq}\) 。 整一下上式得到 \(x\times (1-\frac xp-\frac xq+\frac x{pq})=x\times (1-\frac 1p)\times(1-\frac 1q)\) 。 归纳一下就可以得到 \(\varphi\) 的计算式了。 对于上式推导式,可以用暴力求,时间复杂度为 \(O(\sqrt

欧拉函数的应用(hdu 3501)

痴心易碎 提交于 2019-12-03 17:15:20
原题链接 http://acm.hdu.edu.cn/showproblem.php?pid=3501 Given a positive integer N, your task is to calculate the sum of the positive integers less than N which are not coprime to N. A is said to be coprime to B if A, B share no common positive divisors except 1. Input For each test case, there is a line containing a positive integer N(1 ≤ N ≤ 1000000000). A line containing a single 0 follows the last test case. Output For each test case, you should print the sum module 1000000007 in a line. Sample Input 3 4 0 Sample Output 0 2 题意分析: 给一个整数n,求小于n且与n不互质的数的和 欧拉函数φ(n)的值为小于n且与n互质的数的个数(见文末)

浅谈欧拉函数【复习】

瘦欲@ 提交于 2019-12-03 14:23:09
浅谈欧拉函数【复习】 定义: φ(n)表示小于n的正整数中和n互质的个数; 性质: 1.积性函数:φ(n×m)=φ(n)×φ(m) (感性理解) 2.a^φ(n)^≡1(mod n),当且仅当gcd(a,n)==1 (感性理解) 3.[1,n]中与n互质的数的和为n×φ(n)/2 4.Σφ(d)=n,其中(d|n) (感性理解) 5.φ(p^a^)=p^a^-p^a-1^,其中(p为素数,a为正整数) 证明: 这里插入个游戏: 问题:求正整数3^83^的最后两位数 回到正题 一:√n求单个数的欧拉函数值: 、 根据性质五: code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN = 1e7 + 10; int p, ans = 1, N; void GetPhi() { for(int i = 2; i * i <= p; i++) { if(p % i == 0) { int now = i - 1; p /= i; while(p % i == 0) now = now * i, p /= i; ans = ans * now; } } if(p != 1) ans *= (p - 1); } int