题目链接:https://vjudge.net/problem/SPOJ-PGCD

题目大意:

  给定 \(N\) 和 \(M\),求满足 \((1 \le x \le N), (1 \le y \le M)\),且 \(gcd(x,y)\) 为素数的 \((x,y)\) 的对数。

知识点:  莫比乌斯反演

解题思路:

  设 \(g(p)\) 表示满足 \((1 \le x \le N), (1 \le y \le M)\),且 \(gcd(x,y) = p\) 的 \((x,y)\) 的对数。直接求 \(g(p)\) 是不可行的,其时间复杂度为 \(O(NM)\).

  再设 \(f(p)\) 表示满足 \((1 \le x \le N), (1 \le y \le M)\),且 \(p|gcd(x,y)\) 的 \((x,y)\) 的对数,易知 \(f(p)=(N/p)*(M/p)\)。且不难推出 \(f(n) = \sum \limits_{n|d} g(d)\).    \((1)\)

  莫比乌斯反演公式:若满足 \(F(n) = \sum \limits_{n|d} f(d)\),则有 \(f(n) = \sum \limits_{n|d} \mu(\frac{d}{n})F(d)\).

  将其代入式 \((1)\) 得:

  \(g(n) = \sum \limits_{n|d} \mu(\frac{d}{n})f(d) = \sum \limits_{n|d} \mu(\frac{d}{n})(N/d)(M/d)\)  \((2)\)

  最终的答案为(\(p\) 代表质数):

  \(\sum \limits_{p} g(p) = \sum \limits_{p} \sum \limits_{p|d} \mu(\frac{d}{p})(N/d)(M/d)\)

      \(= \sum \limits_{d}^{min(M,N)} (N/d)(M/d) \sum \limits_{p|d} \mu(\frac{d}{p})\)  \((3)\)

第二个求和函数可以预处理,枚举每一个质数,更新对应的前缀和。

AC代码:

 #include <bits/stdc++.h>

 using namespace std;
typedef long long LL;
const int maxn = 1e7+;
bool check[maxn];
int prime[maxn],Mobius[maxn];
int tot;
int u[maxn]; void init(){
Mobius[]=;
tot=;
for(int i=;i<maxn;i++){
if(!check[i]){
prime[tot++]=i;
Mobius[i]=-;
}
for(int j=;j<tot&&i*prime[j]<maxn;j++){
check[i*prime[j]]=true;
if(i%prime[j]==){
Mobius[i*prime[j]]=;
break;
} else
Mobius[i*prime[j]]=-Mobius[i];
}
}
for(int i=;i<tot;i++){
for(int j=prime[i];j<maxn;j+=prime[i]){
u[j]+=Mobius[j/prime[i]]; // u[j] 代表分子为 j(对应式3中的d) 的和函数的值
}
}
for(int i=;i<maxn;i++) u[i]+=u[i-]; //处理出前缀和
}
int main(){
init();
int t,n,m;
scanf("%d",&t);
while(t--){
LL ans=;
int last;
scanf("%d%d",&n,&m);
for(int i=;i<=min(n,m);i=last+){
last=min(n/(n/i),m/(m/i)); // [i,last] 这一段的 u[] 对应 (N/d)(M/d) 相等,不难用实验验证
ans+=(LL)(n/i)*(m/i)*(u[last]-u[i-]);
}
printf("%lld\n",ans);
}
return ;
}

     

  

最新文章

  1. springmvc&lt;一&gt;一种资源返回多种形式【ContentNegotiatingViewResolver】
  2. CCDH证书
  3. python-面向对象(股票对象举例)
  4. MongoDB (八) MongoDB 文档操作
  5. Mysql常用show命令,show variables like xxx 详解,mysql运行时参数
  6. 多线程爬虫Java调用wget下载文件,独立线程读取输出缓冲区
  7. css的内容
  8. XShell上传文件到Linux服务器上
  9. &lt;发条游戏设计&gt;粗翻——序言、
  10. ubuntu14.04 放开串口权限
  11. jmeter插件如何协助进行内存监控 之 PerfMon Metrics Collector设置
  12. ABP集成WIF实现单点登录
  13. 单片机内程序运行的时候ram空间是如何分配的?
  14. SqlServer2008基础知识:安全与权限
  15. Python连接MySQL数据库(pymysql的使用)
  16. Kibana安装及使用说明
  17. mysql如何查询当前周的第一天的日期?
  18. Jmeter中各种参数化设置的方法
  19. zookeeper 高可用集群搭建
  20. Ubuntu 16.04安装Oracle 11gR2入门教程图文详解

热门文章

  1. JDK14的新特性
  2. F查询,Q查询,事物,only与defer
  3. 前端跨域解决方案: JSONP的通俗解说和实践
  4. 记坑: ConfigurationProperties 和 RefreshScope
  5. mac OS 安装 Node.js
  6. windows下安装Pycham2020软件
  7. 网络流--最大流--hlpp(预流推进)模板
  8. 转载acm几何基础(2)
  9. 利用github的webhook进行自动部署
  10. D. Caesar&#39;s Legions