欧拉函数

[欧拉函数]BZOJ 2186 沙拉公主的困惑

时光怂恿深爱的人放手 提交于 2019-11-27 14:46:24
https://www.luogu.org/problem/P2155 分析 对一个阶乘求欧拉函数,可以想到欧拉函数的一个基本公式: $\varphi (n)=n\prod_{i=1}^k \frac{p_i-1}{p_i}$ 因为阶乘是乘积形式的,所以我将1~m中所有phi都搞出来,给他们的倍数累计贡献即可 然后逆元线性求掉,就随便搞搞了 #include <iostream> #include <cstdio> using namespace std; const int N=1e7+1; typedef long long ll; int T,n,m; int P,fac[N],inv[N],cal[N]; bool nonprime[N]; int prime[700010],cnt; void Prime() { for (int i=2;i<N;i++) { if (!nonprime[i]) prime[++cnt]=i; for (int j=1;j<=cnt;j++) { if (1ll*i*prime[j]>=N) break; nonprime[i*prime[j]]=1; if (i%prime[j]==0) break; } } inv[1]=1;fac[1]=1;cal[1]=1; for (int i=2;i<N;i++) { inv[i]=1ll*

欧拉函数性质及模板

与世无争的帅哥 提交于 2019-11-27 13:50:00
欧拉函数 φ ( n ) : 其值为小于 n且与 n 互质的数的个数 (以下p表示质数) ①当n = p^k时: ②若m,n互质: ③n为质数时: ④对任何两个互质的正整数a, m(m>=2)有 即欧拉定理 当m是质数p时,此式则为: 即费马小定理 ⑤所有小于 n与 n互质数的和 s u m = n × φ ( n ) 2 来源: https://www.cnblogs.com/philo-zhou/p/11366319.html

BZOJ 2818 欧拉函数,线性筛

烂漫一生 提交于 2019-11-27 13:39:25
题目链接: https://www.acwing.com/problem/content/description/222/ 给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对。 GCD(x,y)即求x,y的最大公约数。 输入格式 输入一个整数N 输出格式 输出一个整数,表示满足条件的数对数量。 数据范围 1≤N≤10^7 输入样例: 4 输出样例: 4 题解: 首先,用线性筛可以预处理处素数与欧拉函数。 我们定义 count(x)为: 1<=i,j<=N 有多少对gcd(i,j)=x; 那么原问题就转化成 (要求i是素数) 那么问题就转化成了,怎么能快速的求出count(x) 因为 count(x)为:1<=i,j<=N 有多少对gcd(i,j)=x , 那么i和j必须是x的倍数,i和j的范围是x,2x,3x..... *x 那么我们把i和j都约掉一个x,那么约掉后的i和j要求i和j互质,那么问题就转化成: 1<=i,j<= ,有多少对数字两两互质。 那么很容易想到欧拉函数,euler(x) 是 1到x有多少对数字和x互质,然后用前缀和就可以预处出来 sum[1]=1, sum[i]=sum[i-1]+2*euler[i] 代码: #include<bits/stdc++.h> using namespace std; typedef long

欧拉函数+反演——2019hdu多校6588

旧街凉风 提交于 2019-11-27 13:21:24
\[ 求\sum_{i=1}^{n}(\sqrt[3]i,i)\\ 首先转化一下这个式子,考虑对于i\in[j^3,(j+1)^3-1],\sqrt[3]i=j\\ 所以可以枚举所有j,然后对i\in[j^3,(j+1)^3-1]区间的(i,j)求和即可 那么我们把n分成两部分,分别求和:\\ \sum_{i=1}^{n}(\sqrt[3]i,i)=\sum_{i={\lfloor \sqrt[3]n\rfloor}^3}^{n}(\sqrt[3]n,n) +\sum_{j=1}^{\sqrt[3]n-1}\sum_{i=j^3}^{(j+1)^3-1}(i,j)\\ \] \[ 先来看前面一个合式\sum_{i={\lfloor \sqrt[3]n\rfloor}^3}^{n}(\sqrt[3]n,i),直接用欧拉替换式\\ 原式=\sum_{i={\lfloor \sqrt[3]n\rfloor}^3}^{n}\ \sum_{d|i,d|{\lfloor \sqrt[3]n\rfloor}}\varphi(d) =\sum_{d|{\lfloor \sqrt[3]n\rfloor}}\varphi(d)\big(n/d-(\lfloor \sqrt[3]n\rfloor-1)/d \big)\\ {\lfloor \sqrt[3]n\rfloor}因子是不多的,只有\sqrt

欧拉函数

北城余情 提交于 2019-11-27 10:18:19
本博客转自: https://www.cnblogs.com/linyujun/p/5194170.html 欧拉函数,用φ(n)表示 欧拉函数是求小于等于n的数中与n互质的数的数目 可以先在1到n-1中找到与n不互质的数,然后把他们减掉 比如φ(12) 把12质因数分解,12=2*2*3,其实就是得到了2和3两个质因数 然后把2的倍数和3的倍数都删掉 2的倍数:2,4,6,8,10,12 3的倍数:3,6,9,12 本来想直接用12 - 12/2 - 12/3 但是6和12重复减了 所以还要把即是2的倍数又是3的倍数的数加回来 所以这样写12 - 12/2 - 12/3 + 12/(2*3) 这叫什么,这叫容斥啊,容斥定理听过吧 比如φ(30),30 = 2*3*5 所以φ(30) = 30 - 30/2 - 30/3 - 30/5 + 30/(2*3) + 30/(2*5) + 30/(3*5) - 30/(2*3*5) 但是容斥写起来好麻烦( ̄. ̄) 有一种简单的方法 φ(12) = 12*(1 - 1/2)*(1 - 1/3) = 12*(1 - 1/2 - 1/3 + 1/6) φ(30) = 30*(1 - 1/2)*(1 - 1/3)*(1 - 1/5) = 30*(1 - 1/2 - 1/3 - 1/5 + 1/6 + 1/10 + 1/15 - 1/30) 你看(

欧拉函数——POJ - 2478

不羁岁月 提交于 2019-11-27 07:59:21
题目链接 找出2-n的所有欧拉函数值相加就能得到答案 不过多亏了这道题没卡时 题目代码 #include<iostream> #include<stdio.h> #include<string.h> #include<vector> using namespace std; typedef long long LL; const int maxn=1000007; int phi[maxn],prime[maxn]; bool check[maxn]; int cnt=0; void euler(){ phi[1]=1; for(int i=2;i<maxn;i++){ if(!check[i]){ prime[cnt++]=i; phi[i]=i-1; } for(int j=0;j<cnt&&i*prime[j]<maxn;j++){ check[i*prime[j]]=true; if(i%prime[j]) phi[i*prime[j]]=phi[i]*(prime[j]-1); else{ phi[i*prime[j]]=phi[i]*prime[j]; break; } } } } int main(){ int n; euler(); while(scanf("%d",&n)){ if(n==0)break; LL sum=0; for(int i=2;i<=n;i+

【 欧拉函数 】GCD - Extreme (II)

我只是一个虾纸丫 提交于 2019-11-27 05:28:27
Step1 Problem 原题 给一个数n,输出sigma(gcd(i,j))1<=i<=j,i<=j<=n Step2 Ideas: 假设a、b(a<b)互质,那么gcd(a,b)=1,这样当i循环到a、j循环到b时就会向结果中+1,而i循环到2*a、j循环到2*b时就会向结果中+2(gcd(2*a,2*b)=2)...循环到k*a和k*b时就会向结果中+k。这样实际上引起结果变化的根源就在于各对互质的数,当i、j循环到他们自身或者自身的倍数时就会引起结果的改变,那么我们不妨先将每对互质的数对结果的贡献值算出来,最后将各对互质的数对结果的贡献累加起来就可以了。 假设和b互质的数有n个,也就是n对(?,b)(?和b互质),那么在i、j循环到?、b时结果会增加n,循环到(2*?,2*b)时结果就会增加2*n...当i、j循环到k*?、k*b时结果就会增加k*n。那么我们不妨用a[i]记录各种k、b在满足k*b=i时会增加多少结果, 也就是说a[i]记录的是小于i的每个数与i最大公约数之和 ,那么最后我们要输出的就是a[2]+a[3]+...+a[N]。 至于找和b互质的数,就是计算b的欧拉函数的值,然后暴力循环k,并修改对应的a[k*b]即可,整体的复杂度是O(N*logN)的。 欧拉公式的延伸 : 小于n 与n互质的数的和 是euler(n)*n/2 思路来源 Step3

欧拉函数

风格不统一 提交于 2019-11-26 13:19:18
欧拉定理是用来阐述素数模下,指数同余的性质。 欧拉定理:对于正整数N,代表小于等于N的与N互质的数的个数,记作φ(N) 例如φ(8)=4,因为与8互质且小于等于8的正整数有4个,它们是:1,3,5,7 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+5; int mark[maxn],prime[maxn];//mark为1标记不是素数 int phi[maxn],cnt; void init(int n){ phi[1]=1; for(int i=2;i<=n;i++){ if(!mark[i]){ prime[++cnt]=i; //i为素数 phi[i]=i-1; //φ(p)=p-1 } for(int j=1;j<=cnt;j++){//从现求出素数枚举 if(i*prime[j]>n) break; mark[i*prime[j]]=1; if(i%prime[j]==0){//φ(p*i)=p*φ(i) (当p%i==0时) phi[i*prime[j]]=prime[j]*phi[i]; break; } else //φ(p*i)=(p-1)*φ(i) (当p%i!=0时) phi[i*prime[j]]=phi[i]*phi[prime[j]]; } } } int main(){

[欧拉函数] Bzoj P2226 LCMSum

社会主义新天地 提交于 2019-11-26 12:31:36
Description Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n,n), where LCM(i,n) denotes the Least Common Multiple of the integers i and n. 题解 代码 1 #include <cstdio> 2 #include <iostream> 3 #define N 1000010 4 #define ll long long 5 using namespace std; 6 ll T,bz[N],phi[N],q[N],ans[N]; 7 int main() 8 { 9 scanf("%lld",&T),phi[1]=1; 10 for (ll i=2;i<=N;i++) 11 { 12 if (!bz[i]) q[++q[0]]=i,phi[i]=i-1; 13 for (ll j=1;j<=q[0]&&i*q[j]<=N;j++) 14 if (i*q[j]<N) 15 { 16 bz[i*q[j]]=1; 17 if (i%q[j]==0) { phi[i*q[j]]=phi[i]*q[j]; break; } 18 phi[i*q[j]]=phi[i]*(q[j]-1); 19 } 20 } 21 for (int i

Euler:欧拉函数

我与影子孤独终老i 提交于 2019-11-26 01:35:27
/原文: 2018-12-18 /更新于2019-8-7 欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。 通式: 其中p 1 , p 2 ……p n 为x的所有质因数,x是不为0的整数。 比如x=12,拆成质因数为12=2*2*3, 12以内有1/2的数是2的倍数,那么有1-1/2的数不是2的倍数(1,3,5,7,9,11), 这6个数里又有1/3的数是3的倍数, 只剩下(1 - 1 / 2 - 1 / 3 )的数既不是2的倍数,也不是3的倍数(1,5,7,11)。 这样剩下的12*(1 - 1 / 2 - 1 / 3 )=4,即4个数与12互质,所以φ(12)=4。 证明:对于正整数x, 如果x=1,则 φ(1) = 1。 1与任何数(包括自身)都构成互质关系。 如果x是质数,则 φ(x)=x-1 。 质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。 如果n只有一个质因数p,即x = p^k(p为质数,k>=1),则φ(p k )=p k (1-1/p)=p k -p k-1 。 从1~x中,p的倍数共有x/p个,共占了1/p,则减去这些数后,还剩下x*(1-1/p)个。 可以看出,上一种情况是 k=1 时的特例。 如果n可以分解成两个互质的整数之积,即n = p 1 * p 2, 则 φ(x) = φ(p 1 * p 2 ) =