Gcd HYSBZ - 2818
题意:
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对.
思路:
想想容斥,莫比乌斯,最先想到的还是欧拉函数
k为质数,gcd(a,b)=k,所以有gcd(a/k,b/k)=1;
显然欧拉函数可以轻易得到gcd()=1的一堆答案
有两种方案:
遍历1-n的欧拉函数值每个乘以(n/i)的素数个数前缀和,然后果断超时了。。。。。。
这里的时间复杂度是O(n);
另外一种方案,
遍历1-n的所有素数,每个乘以(n/primer[i])的欧拉函数前缀和,然后过了。。。。。
这样时间复杂度显然降低了不少,甚至随着n的增大,可以达到O(n/In(n))..
由于是数对,这里记得要乘以2的处理,而(1,1)乘以二了显然要减去1
又一次欧拉函数实现了容斥
#include<stdio.h>
#include<string.h>
#define maxn 10000009
int p[maxn];
bool book[maxn];
long long s[maxn];
int prime[maxn];
int num=0;
void init()
{memset(book,true,sizeof(book));p[1]=1;for(int i=2;i<maxn;i++){if(book[i]){prime[num++]=i;p[i]=i-1;}for(int j=0;j<num && prime[j]*i<=maxn;j++){book[i*prime[j]]=false;if(i%prime[j]==0){p[i*prime[j]]=p[i]*prime[j];break;}else p[i*prime[j]]=p[i]*(prime[j]-1);}}s[0]=0; for(int i=1;i<maxn;i++)s[i]=s[i-1]+p[i];
}
int main()
{init();int n;long long a;while(~scanf("%d",&n)){a=0;for(int i=0;n>=prime[i];i++)a+=(2*s[n/prime[i]]-1);//减一是为了 欧拉函数(1)=1 printf("%lld\n",a); }return 0;}
莫比乌斯
我们套路的知道
F(d)= sigma(f(i)) [ d|i ]
f(t) = sigma u(i/d) * F(i) [d|i]
t遍历全部质数
ans = sigma ( sigma u(i/d) * F(i) [d|i] ) [d为质数]
对于不同的质数d , F[i]=(n/ i)*(n/ i) 显然是一样的,u(i/d)是不一样的
比如 F[12]=(n/12)*(n/12) ,对于d=2 与 d=3 时,u(12/3) 与 u(12/2)
也就是说我们可以通过每种莫比乌斯函数和的形式,得到答案
如sum[12]=u[12/2] + u[12/3]
sum[30]=u[30/2]+u[30/3]+u[30/5]
于是我们只要O(n)遍历一遍,ans+=( (n/ i)*(n/ i)* sum[i]);
那么sum[i]要怎么求?
当n不等于1时,n所有因子的莫比乌斯函数值的和为0,
sum(i)=sum()
看了一篇博客:http://blog.csdn.net/u014610830/article/details/49390831
里面讲的很详细,
设sum(d)=∑p|dμ(dp)
这里比较特殊的是p是质数。在素数筛法中sum(d∗p)这个值如果快速更新?
当p|d时:sum(d∗p)=μ(d)。
当p不能整除d时:sum(d∗p)=μ(d)−sum(d)
o(n)复杂度算出了sum(x)值。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000010;
int prime[maxn],mu[maxn],sum[maxn];
bool check[maxn];
void Mobius(){memset(check,false,sizeof(check));mu[1] = 1;prime[0] = 0;for(int i=2;i<maxn;i++){if(!check[i]){mu[i] = -1;sum[i] = 1;prime[++prime[0]] = i;}for(int j=1;j<=prime[0];j++){if(i*prime[j] >= maxn) break;check[i*prime[j]] = true;if(i % prime[j]){mu[i*prime[j]] = -mu[i];sum[i*prime[j]] = mu[i] - sum[i];}else{mu[i*prime[j]] = 0;sum[i*prime[j]] = mu[i];break;}}}
}
int main()
{Mobius();long long ans=0;int n;while(~scanf("%d",&n)){ans=0;for(int i=2;i<=n;i++)ans += (long long)(n/i)*(long long)(n/i)*sum[i];printf("%lld\n",ans);}return 0;
}
Gcd HYSBZ - 2818相关推荐
- HYSBZ - 2818 Gcd —— 莫比乌斯反演
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 8172 Solved: 3609 Description 给定整数N,求1&l ...
- HYSBZ 2818 Gcd
Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sa ...
- 最大公约数gcd函数简介
gcd函数简介 最大公因数(英语:highest common factor,hcf)也称最大公约数(英语:greatest common divisor,gcd)是数学词汇,指能够整除多个整数的最大 ...
- [kuangbin]各种各样的题单
[kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...
- BZOJ 2818: Gcd 筛法
2818: Gcd 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2818 Description 给定整数N,求1<=x,y< ...
- 欧拉筛(bzoj 2818: Gcd)
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 6707 Solved: 2952 [Submit][Status][Discu ...
- BZOJ 2818: Gcd区间内最大公约数 为素数的对数(欧拉函数的应用)
传送门 2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3649 Solved: 1605 [Submit][Status][Dis ...
- BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes银幕)
标题效果:定整N(N <= 1e7),乞讨1<=x,y<=N和Gcd(x,y)素数的数(x,y)有多少.. 思考:推,. 建立gcd(x,y) = p,然后,x / p与y / p互 ...
- BZOJ 2818——Gcd
题意:给定n,求gcd(x,y)==p 的对数,其中(1<=x<y<n) 思路: 求(x, y) = k, 1 <= x, y <= n的对数等于求(x, y) = 1, ...
最新文章
- Syntax error, type parameters are only available if source level is 1.5
- 按照一定策略把网页抓回到搜索引擎服务器的,SEO新手学习:搜索引擎的基本步骤...
- 自动点击器如何设置最快_铁粉技巧 | iPhone如何设置自动开关机,iPhone更改字体...
- sed搜索某行在行末追加_示范sed指定某行插入 追加和全局替换
- 记一次高io wait问题分析及解决-设置合理的SGA
- ant java 外部jar包_java – 在使用Ant的新jar文件构建中包括外部jar文件
- python if elif else
- leecode第三十题(串联所有单词的子串)
- Pandas 速查手册中文版
- php留言板制作模板,简单5步,制作wordpress留言板
- Ubuntu更新下载源
- 联通计算机用户名和密码,终极:联通路由器的默认登录密码是什么?
- onenote 插入图片或文件后 显示 您不再有权访问此笔记本。如果还原权限,我们将再次同步
- opencv,获取图片
- hss网元 java_在NB-IoT建构和流程中,作为网元实体的MME和HSS进行了哪些功能方面的升级?...
- android 文件名编码,安卓删除纯乱码文件名的文件
- 如何使用 cri-docker 解决 Kubernetes 1.24 不支持 Docker 的问题
- 【Python】Transformers加载BERT模型from_pretrained()问题解决
- linux中扫描仪驱动程序,VueScan For Linux通用扫描仪驱动下载_VueScan For Linux通用扫描仪驱动官方下载-太平洋下载中心...
- 火车票抢票软件哪个成功率高更靠谱?