题意:

给定整数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相关推荐

  1. HYSBZ - 2818 Gcd —— 莫比乌斯反演

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 8172  Solved: 3609 Description 给定整数N,求1&l ...

  2. HYSBZ 2818 Gcd

    Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sa ...

  3. 最大公约数gcd函数简介

    gcd函数简介 最大公因数(英语:highest common factor,hcf)也称最大公约数(英语:greatest common divisor,gcd)是数学词汇,指能够整除多个整数的最大 ...

  4. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  5. BZOJ 2818: Gcd 筛法

    2818: Gcd 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2818 Description 给定整数N,求1<=x,y< ...

  6. 欧拉筛(bzoj 2818: Gcd)

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 6707  Solved: 2952 [Submit][Status][Discu ...

  7. BZOJ 2818: Gcd区间内最大公约数 为素数的对数(欧拉函数的应用)

    传送门 2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3649 Solved: 1605 [Submit][Status][Dis ...

  8. BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes银幕)

    标题效果:定整N(N <= 1e7),乞讨1<=x,y<=N和Gcd(x,y)素数的数(x,y)有多少.. 思考:推,. 建立gcd(x,y) = p,然后,x / p与y / p互 ...

  9. BZOJ 2818——Gcd

    题意:给定n,求gcd(x,y)==p 的对数,其中(1<=x<y<n) 思路: 求(x, y) = k, 1 <= x, y <= n的对数等于求(x, y) = 1, ...

最新文章

  1. Syntax error, type parameters are only available if source level is 1.5
  2. 按照一定策略把网页抓回到搜索引擎服务器的,SEO新手学习:搜索引擎的基本步骤...
  3. 自动点击器如何设置最快_铁粉技巧 | iPhone如何设置自动开关机,iPhone更改字体...
  4. sed搜索某行在行末追加_示范sed指定某行插入 追加和全局替换
  5. 记一次高io wait问题分析及解决-设置合理的SGA
  6. ant java 外部jar包_java – 在使用Ant的新jar文件构建中包括外部jar文件
  7. python if elif else
  8. leecode第三十题(串联所有单词的子串)
  9. Pandas 速查手册中文版
  10. php留言板制作模板,简单5步,制作wordpress留言板
  11. Ubuntu更新下载源
  12. 联通计算机用户名和密码,终极:联通路由器的默认登录密码是什么?
  13. onenote 插入图片或文件后 显示 您不再有权访问此笔记本。如果还原权限,我们将再次同步
  14. opencv,获取图片
  15. hss网元 java_在NB-IoT建构和流程中,作为网元实体的MME和HSS进行了哪些功能方面的升级?...
  16. android 文件名编码,安卓删除纯乱码文件名的文件
  17. 如何使用 cri-docker 解决 Kubernetes 1.24 不支持 Docker 的问题
  18. 【Python】Transformers加载BERT模型from_pretrained()问题解决
  19. linux中扫描仪驱动程序,VueScan For Linux通用扫描仪驱动下载_VueScan For Linux通用扫描仪驱动官方下载-太平洋下载中心...
  20. 火车票抢票软件哪个成功率高更靠谱?

热门文章

  1. python换照片底色_详解Python给照片换底色(蓝底换红底)
  2. O2O模式成功案例分享 汲取精华化为己用
  3. /deep/ >>> ::v-deep的用法
  4. 浅谈软件开发项目的质量控制
  5. Macbook Tools
  6. 美国基础设施法案对该国加密矿业会产生什么影响?
  7. 高红梅:第三章 第二节 身份焦虑与英雄梦
  8. 数通 | 静态路由表的配置(含负载分担、路由备份)
  9. SIFT算法特征描述子构建---关键点定位原理及代码
  10. 端口渗透——21端口FTP