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