博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】2818: Gcd(欧拉函数+质数)
阅读量:5131 次
发布时间:2019-06-13

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

题目

 

 

分析

呃,看到题后感觉很像上面的仪仗队。

仪仗队求的是$ gcd(a,b)=1 $

本题求的是$ gcd(a,b)=m $ 其中m是质数

把 $ gcd(a,b)=1 $ 变形成 $ gcd(a,b)*m=m $

然后在n的范围内枚举一下,使 $ gcd(a,b)*m <= n $

再像仪仗队那样用欧拉函数搞一搞。

没了。

 

 

代码

 

#include 
using namespace std;const int maxn=1e7+3e6;int n,pri[maxn],isp[maxn],cnt;int phi[maxn];int prime(){ for(int i=1;i<=n;i++) isp[i]=1; for(int i=2;i<=n;i++){ if(!isp[i]) continue; pri[++cnt]=i; for(int j=i+i;j<=n;j+=i) isp[j]=0; }}void Phi(){ memset(phi,0,sizeof(phi)); phi[1]=1; for(int i=2;i<=n;i++){ if(phi[i]) continue; for(int j=i;j<=n;j+=i){ if(!phi[j]) phi[j]=j; phi[j]=phi[j]/i*(i-1); } }}long long sum[maxn]; int main(){ cnt=0; long long ans=0; scanf("%d",&n); Phi(); prime(); pri[0]=1; for(int i=1;i<=n;i++) sum[i]=sum[i-1]+phi[i]; for(int i=1;i<=cnt;i++) ans+=(long long)2*sum[n/pri[i]]-1; printf("%lld\n",ans); return 0;}

 

 

转载于:https://www.cnblogs.com/noblex/p/9141799.html

你可能感兴趣的文章
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Python IO模型
查看>>
DataGridView的行的字体颜色变化
查看>>
局域网内手机访问电脑网站注意几点
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Android-多线程AsyncTask
查看>>
LeetCode【709. 转换成小写字母】
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
【题解】青蛙的约会
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
Android 官方新手指导教程
查看>>
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
Red and Black(poj-1979)
查看>>
安装 Express
查看>>
存储(硬件方面的一些基本术语)
查看>>