洛谷 P2568 GCD
2024-08-24 07:51:32
https://www.luogu.org/problemnew/show/P2568#sub
最喜欢题面简洁的题目了。
本题为求两个数的gcd是素数,那么我们将x和y拆一下,
假设p为$gcd(x,y)$,且p是一个素数,$x=a \times p , y = b \times p $。
然而要满足p的条件的话,a和b一定是互质的,满足$0 \le a,b \le \frac{n}{p} $
这样的话我们可以枚举这个质数p,将小于$\frac{n}{p}$的数,以及与它互质的数加起来。
互质的数的个数自然想到了欧拉函数,优化想加的话显然前缀和(我就琢磨了半天)
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define LL long long
int n;
int prime[],tot;
bool vis[];
LL phi[],ans;
void get_phi()
{
phi[]=;
for(int i=;i<=n;i++)
{
if(!vis[i])prime[++tot]=i,phi[i]=i-;
for(int j=;j<=tot&&prime[j]*i<=n;j++)
{
vis[prime[j]*i]=;
if(i%prime[j]==)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
for(int i=;i<=n;i++)phi[i]=phi[i-]+phi[i];
}
int main()
{
scanf("%d",&n);
get_phi();
for(int i=;i<=tot;i++)ans+=phi[n/prime[i]];
printf("%lld",ans*+tot);
//乘2的原因就不多说了(x,y)和(y,x)啊。
之所以再加一个tot是因为我的phi数组定义的phi[1]=0.
}
最新文章
- JAVA回调机制(CallBack)详解
- [nodemon] Internal watch failed: watch ENOSPC错误解决办法
- Python socket超时
- 【linux】学习1
- C/S B/S 及WEB工作原理
- opencv学习笔记(03)——遍历图像(迭代器法)
- 重启php-fpm
- EasyUI 添加tab页(iframe方式)
- HDOJ-ACM1003(JAVA)
- docker 查看容器详细
- ARM入门实践(一)----Mini6410上最简单的LED点灯裸机程序
- linux下安装python3.3.4
- 【Sql】mySQL在windows环境启动
- Harbor私有镜像仓库(上)
- 谷歌浏览器(Chrome)禁止浏览器缓存 设置
- Python: 下载底层由Python2转Python3环境更新手记
- DG备库缺失归档文件GAP日志
- kali下添加PATH环境变量
- Apache Flume 学习
- JDk1.8源码StringBuffer