博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gcd(bzoj 2818)
阅读量:5039 次
发布时间:2019-06-12

本文共 1286 字,大约阅读时间需要 4 分钟。

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
#include
#define N 10000010using namespace std;int prime[N],f[N],euler[N],n,num;void get_prime(){ for(int i=2;i<=n;i++){ if(!f[i]) prime[++num]=i; for(int j=1;j<=num;j++){ if(i*prime[j]>n) break; f[prime[j]*i]=1; if(i%prime[j]==0) break; } }}void get_euler(){ for(int i=1;i<=n;i++) euler[i]=i; for(int i=2;i<=n;i++){ if(euler[i]==i){ for(int j=i;j<=n;j+=i) euler[j]=euler[j]/i*(i-1); } }}int oula(int x){ int ans=x; for(int i=2;i*i<=x;i++){ if(x%i==0){ ans-=ans/i; while(x%i==0) x/=i; } } if(x>1) ans-=ans/x; return ans;}int main(){ scanf("%d",&n); get_prime();get_euler(); long long ans=0; for(int i=1;i<=num;i++){ int p=prime[i];long long tot=0; for(int j=p;j<=n;j+=p) tot+=(long long)euler[j/p]; ans+=tot*2-1; } cout<

 

转载于:https://www.cnblogs.com/harden/p/6517213.html

你可能感兴趣的文章
web自己主动保存表单
查看>>
lua基金会【五岁以下儿童】I/O文件操作
查看>>
一个小的日常实践——高速Fibonacci数算法
查看>>
创建与删除索引
查看>>
java的基本数据类型
查看>>
机器学些技法(9)--Decision Tree
查看>>
静态页面复习--用semantic UI写一个10min首页
查看>>
在Windows下安装64位压缩包版mysql 5.7.11版本的方法
查看>>
公安项目项目感想
查看>>
IOS-组件化架构漫谈
查看>>
Android 性能测试工具- GT
查看>>
[bzoj 2005] [NOI2010]能量采集
查看>>
js闭包演示
查看>>
android实现点击背景图片不同区域实现不同事件
查看>>
玲珑OJ 1082:XJT Loves Boggle(爆搜)
查看>>
JDK、JRE、JVM三者间的联系与区别
查看>>
ssm中实现excle导入导出
查看>>
2011-07-06 11:19 Hibernate提供了3种检索策略
查看>>
CSS Hacker
查看>>
有关Botton的用法(一)
查看>>