Description

给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.

Input

一个整数N

Output

如题

Sample Input

4

Sample Output

4

HINT

hint

对于样例(2,2),(2,4),(3,3),(4,2)

1<=N<=10^7

/*
根据gcd(x,y)=p,得到gcd(x/p,y/p)=1
先枚举所有素数p,然后枚举p的倍数x,利用欧拉函数求出y的个数。
直接计算欧拉函数会超时,可以预处理出来。
*/
#include<cstdio>
#include<iostream>
#define N 10000010
using namespace std;
int prime[N],f[N],euler[N],n,num;
void get_prime(){
for(int i=;i<=n;i++){
if(!f[i]) prime[++num]=i;
for(int j=;j<=num;j++){
if(i*prime[j]>n) break;
f[prime[j]*i]=;
if(i%prime[j]==) break;
}
}
}
void get_euler(){
for(int i=;i<=n;i++) euler[i]=i;
for(int i=;i<=n;i++){
if(euler[i]==i){
for(int j=i;j<=n;j+=i)
euler[j]=euler[j]/i*(i-);
}
}
}
int oula(int x){
int ans=x;
for(int i=;i*i<=x;i++){
if(x%i==){
ans-=ans/i;
while(x%i==) x/=i;
}
}
if(x>) ans-=ans/x;
return ans;
}
int main(){
scanf("%d",&n);
get_prime();get_euler();
long long ans=;
for(int i=;i<=num;i++){
int p=prime[i];long long tot=;
for(int j=p;j<=n;j+=p)
tot+=(long long)euler[j/p];
ans+=tot*-;
}
cout<<ans;
return ;
}

最新文章

  1. 烂泥:学习tomcat之通过shell批量管理多个tomcat
  2. Kafka深度解析
  3. Win8.1无法安装.NET Framework 3.5的解决办法
  4. Android学习地址
  5. cocos基础教程(2)Window环境下搭建(补充)
  6. phpMyAdmin安装
  7. 【开源项目6】介绍MenuDrawer这个牛x的控件,实现左右出菜单,上下出菜单
  8. [大牛翻译系列]Hadoop 翻译文章索引
  9. 自己写http获取网络资源和解析json数据
  10. iOS平台在ffmpeg中使用librtmp
  11. Access restriction: The type * is not accessible due to restrict,报错问题
  12. AE基础知识之地图浏览
  13. Python循环依赖问题的解决
  14. I - Tunnel Warfare HDU - 1540 线段树最大连续区间
  15. vue里的样式添加之行间样式
  16. Python自学:第二章 使用制表符或换行符来添加空白
  17. poj1753(位运算压缩状态+bfs)
  18. 从经典面试题看java中类的加载机制
  19. NSTimer、performSelector 函数没有被调用的原因
  20. Sysprep错误一则

热门文章

  1. 获取页面的title值
  2. 主题模型LDA及在推荐系统中的应用
  3. 05tar命令详解
  4. LeetCode之Weekly Contest 101
  5. 【linux】【进程】stand alone 与 super daemon 区别
  6. web开发框架tornado
  7. build_mem_type_table
  8. vmware10下载地址
  9. debian7不能apt安装emacs24
  10. java模糊关键字查询