线性求欧拉函数值和筛选素数
来源:互联网 发布:淘宝四金冠店铺 编辑:程序博客网 时间:2024/06/08 18:15
2818: Gcd
题目:
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对. 1<=N<=10^7
算法:
求解 g = Gcd(x,y)为素数,转换问题成x/g,y/g互质。所以,只要求出[1,N/pi]内互质的对数(pi为1....N之间的素数)。枚举pi就可以了。而这里就可以用到线性的欧拉求解,普通欧拉为O(nlognlogn)。
/*线性素数加欧拉筛法O(N)题目: 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 其实就是一个转化问题,求gcd(x, y) = k, 1 <= x, y <= n的对数等于:求gcd(x, y) = 1, 1 <= x, y <= n/k的对数。(在[1,n/k]存在多少个有序对(x,y)使得互质)那么接下来我们就只要枚举每个素数k=prime[i]了,然后用到欧拉函数就可以求出来了,Σ( 2*Σ( phi[n/prime[i]] ) - 1 )。N < 10^7 欧拉函数:phi[n]表示1~n内有多少个数与n互质*/typedef long long LL;const int MAXN = 10000000 + 10;int top,primes[700000];LL phi[MAXN];int n;//线性筛欧拉值和素数表void phi_primes(){ top = 0; phi[1] = 1; for(int i = 2;i <= n;++i){ if(!phi[i]){ primes[top++] = i; phi[i] = i - 1; } for(int j = 0;j < top&&i*primes[j] <= n;++j){ if(i%primes[j]) phi[i*primes[j]] = phi[i]*(primes[j] - 1); else {phi[i*primes[j]] = phi[i]*primes[j]; break;} } }}int main(){ scanf("%d",&n); phi_primes(); for(int i = 2;i <= n;++i) phi[i] += phi[i-1]; //1...i内互质的总数 LL ans = 0; for(int i = 0;i < top&&primes[i] <= n;++i){ ans += (phi[n/primes[i]] << 1)-1; //除去素数多算的一次 } printf("%lld\n",ans); return 0;}
0 0
- 线性求欧拉函数值和筛选素数
- 线性筛选素数和线性筛选欧拉函数【bzoj2190]
- 素数筛选之“普通筛选”和“线性筛选”
- 线性筛选素数模板
- 素数线性筛选
- 素数的线性筛选
- 线性筛选素数法
- 线性筛选素数
- 素数线性筛选法
- 素数线性筛选
- 线性筛选求素数
- 线性筛选求素数
- 【线筛】线性筛选素数
- 线性筛选素数--python
- 线性筛选同时得到欧拉函数表和素数表
- 线性筛选素数。。。。线性哦
- 素数筛选法(普通筛和线性筛)
- 线性筛选素数(欧拉筛选)
- hadoop and mapreduce.
- iOS 中推送的使用详解
- Spring IOC的原理
- quick 中的事件
- unix域套接字的UDP网络编程
- 线性求欧拉函数值和筛选素数
- Cocos开发中Visual Studio下libcurl库开发环境设置
- quick 中的触摸事件
- 自定义表格
- Linux解/压缩命令
- 对c语言中*和&的了解
- Vim的命令大全
- List 循环删除
- unity3d中的.meta是什么东东