我们考虑利用\(\sum\limits_{d|n}\varphi(d)=n\)这一性质来处理这个问题 设\(f(n)=\sum\limits_{i=1}^{n}\varphi(i)\) 那么我们可以得到: \[ \begin{aligned} \sum\limits_{i=1}^{n}\sum\limits_{d|i}\varphi(d)&=\frac{n(n+1)}{2}\\ \end{aligned} \] 所以: \[ \sum\limits_{i=1}^{n}\sum\limits_{d…
求$\sum_{i=1}^{n}\varphi (i)$,$n\leqslant 1e10$. 这里先把杜教筛的一般套路贴一下: 要求$S(n)=\sum_{i=1}^{n}f(i)$,而现在有一数论函数$g(i)$,$g(i)$的前缀和很无脑,且$f$和$g$的狄利克雷卷积的前缀和很无脑(太巧了吧..),那么由 $\sum_{i=1}^{n}\sum_{d|i}f(d)g(\frac{i}{d})$ 闪一句,常用套路:设$i=kd$,转而枚举$k$. $=\sum_{k=1}^{n}g(k)\…
欧拉函数 φ(n) 定义:[1,N]中与N互质的数的个数 //互质与欧拉函数 /* 求欧拉函数 按欧拉函数计算公式,只要分解质因数即可 */ int phi(int n){ int ans=n; ;i<=sqrt(n);i++){ ){ ans=ans/i*(i-); ) n/=i; } } ) ans=ans/n*(n-); return ans; } 性质:1.[1,n]中与n互质的数的和为 n*φ(n)/2; 2.欧拉函数是积性函数    3.p|n && p*p|n =>…
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=n且Gcd(x,y)为素数的数对(x,y)有多少对 思路:先筛出n以内所有的素数顺便筛出欧拉函数,\(gcd(x,y)=k\)等价于\(gcd(\frac{x}{k},\frac{y}{k})=1\) 所以这个问题可以转化为求\(ans=\sum_{i=1}^{tot}\sum_{j=1}^{n/prime[i]}phi[j]\) ,tot为…
/** 大意: 求[a,b] 之间 phi(a) + phi(a+1)...+ phi(b): 思路: 快速求欧拉函数 **/ #include <iostream> #include <cstring> using namespace std; #define Max 3000000 ]; ]; ]; void init() { ; memset(flag,,sizeof(flag)); phi[]=; ;i<=Max;i++)//欧拉筛选 { if(flag[i]) {…
http://poj.org/problem?id=2478 题意:给定一个数x,求<=x的数的欧拉函数值的和.(x<=10^6) 题解:数据范围比较大,像poj1248一样的做法是不可行的了. 首先我们要了解欧拉函数的几个性质和推论:(今天跟好基友Konjak魔芋讨论了好久..) 推论(一): phi(p^k)=(p-1)*p^(k-1) 证明: 令n=p^k,小于等于n的正整数数中,所有p的倍数共有p^k /p = p^(k-1)个. 1~n出去p的倍数,所以phi(n)= n -  p^…
欧拉函数: φ(n)=n*(1-1/p1)(1-1/p2)....(1-1/pk),其中p1.p2-pk为n的所有素因子.比如:φ(12)=12*(1-1/2)(1-1/3)=4.可以用类似求素数的筛法.(素数打表)先筛出n以内的所有素数,再以素数筛每个数的φ值.比如求10以内所有数的φ值:设一数组phi[11],赋初值phi[1]=1,phi[2]=2...phi[10]=10:然后从2开始循环,把2的倍数的φ值*(1-1/2),则phi[2]=2*1/2=1,phi[4]=4*1/2=2,p…
欧拉函数: φ(n)=n*(1-1/p1)(1-1/p2)....(1-1/pk),其中p1.p2…pk为n的所有素因子.比如:φ(12)=12*(1-1/2)(1-1/3)=4.可以用类似求素数的筛法.(素数打表)先筛出n以内的所有素数,再以素数筛每个数的φ值.比如求10以内所有数的φ值:设一数组phi[11],赋初值phi[1]=1,phi[2]=2...phi[10]=10:然后从2开始循环,把2的倍数的φ值*(1-1/2),则phi[2]=2*1/2=1,phi[4]=4*1/2=2,p…
筛素数 void shai() { no[1]=true;no[0]=true; for(int i=2;i<=r;i++) { if(!no[i]) p[++p[0]]=i; int j=1,t=i*p[1]; while(j<=p[0] && t<=r) { no[t]=true; if(i%p[j]==0) //每一个数字都有最小质因子.这里往后的数都会被筛过的,break break; t=i*p[++j]; } } } O(n)筛欧拉函数 void find()…
求1-n的欧拉函数的值 #include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <cmath> #include <cstring> #define inf 2147483647 #define N 1000010 #define p(a) putchar(a) #define For(i,a,b) for(long lo…