【BZOJ 2818】Gcd
2016-06-14 22:07
288 查看
Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.
Solution
把gcd(px,py)=p(p为素数)提一个p出来:gcd(x,y)=1,也就是互质的两个数枚举一个素数,求当前素数的答案,因为在本题中gcd(3,6)和gcd(6,3)这样的算成两种不同的情况,所以*2,又因为这样会把gcd(7,7)这样的算两遍,所以-(素数的个数),
ans=(∑p∑i=2⌊np⌋2∗φ(i))−(素数个数)(p为素数)
因为n<107,枚举每个素数,用前缀和预处理,
复杂度:O(n)
Code
#include<cstdio> #include<cstdlib> #define fo(i,a,b) for(int i=a;i<=b;i++) using namespace std; typedef long long LL; const int N=10005000; LL phi ,ans; int n,pr ; bool prz ; void pre() { fo(i,2,n) { if(!prz[i])pr[++pr[0]]=i,phi[i]=i-1; fo(j,1,pr[0]) { int t=i*pr[j]; if(t>n)break; prz[t]=1; if(i%pr[j]==0){phi[t]=phi[i]*pr[j];break;} phi[t]=phi[i]*phi[pr[j]]; } } fo(i,3,n)phi[i]+=phi[i-1]; } int main() { scanf("%lld",&n); pre(); fo(i,1,pr[0])if(n/pr[i]>1)ans+=phi[n/pr[i]]; printf("%lld\n",ans*2+pr[0]); return 0; }
相关文章推荐
- Java类
- eclipse svn安装
- 独立编译单个C文件快速shell脚本
- APP应用程序图标 及 程序启动画面设置 ios logo设置
- LeetCode:Validate Binary Search Tree
- Android_TakePhoto
- eclipse svn安装
- 【HTML5】表单属性
- C语言学习笔记 链表基础
- 范型程序设计——洗牌
- 动态规划——数塔问题
- cannot mount database in EXCLUSIVE mode
- ThinkPHP报错处理
- python生成log文件
- wget命令
- XSS攻击
- 多线程的实现基础知识总结
- Android逆向工程(一)-Apktool使用
- AjAX(第3章 Ajax的简单例子(Ajax+PHP)
- 1 - SQL Server 2008 之 使用SQL语句创建具有约束条件的表