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