GCD与莫比乌斯反演的勾当
机房最后一个学懵逼钨丝的人
题目一
链接
题目没找到
求\(\sum_{1}^{n}\sum_{1}^{m}gcd(i,j)\)
式子
\(\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M} gcd(i,j)\)
\(\sum\limits_{k=1}^{min(N,M)} k*\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M} [gcd(i,j)==k]=\sum\limits_{k=1}^{min(N,M)} k*\sum\limits_{i=1}^{\frac{N}{k}}\sum\limits_{j=1}^{\frac{M}{k}} [gcd(i,j)==1]\)
\(看这部分\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M} [gcd(i,j)==k]\)
设\(g(d)=\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M} [gcd(i,j)==d]\)
\(f(n)=\sum\limits_{n|d}g(d)=[\frac{N}{d}][\frac{M}{d}]\)(显然,不说了)
\(g(n)=\sum\limits_{n|d}\mu(\frac{d}{n})f(d)\)
\(g(1)=\sum\limits_{i=1}^{min(N,M)}\mu(i)[\frac{N}{i}][\frac{M}{i}]\)
\(ans=\sum\limits_{k=1}^{min(N,M)} k*\sum\limits_{i=1}^{min(N/k,M/k)}\mu(i)[\frac{N/k}{i}][\frac{M/k}{i}]\)
除法分块嵌套复杂度\(O(n)\)
注意
除数不为0
代码
/*
segima gcd n,m
*/
#include <algorithm>
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
const int N=15000007,mod=1e9+7;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int pri[N/10],mu[N],cnt;
bool vis[N];
void Euler(int n) {
vis[1]=mu[1]=1;
for(int i=2;i<=n;++i) {
if(!vis[i]) pri[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*pri[j]<=n;++j) {
vis[ i*pri[j] ] = 1;
if(i % pri[j] == 0) {
mu[ i*pri[j] ] = 0;
break;
} else
mu[ i*pri[j] ] = -mu[i];
}
}
for(int i=1;i<=n;++i) mu[i]+=mu[i-1];
}
int g(int N,int M,int n) {
int ans=0;
for(int l=1,r=1;l<=n;l=r+1) {
r=min(N/(N/l),M/(M/l));
ans=(ans+1LL*(mu[r]-mu[l-1]+mod)%mod*(N/l)%mod*(M/l)%mod)%mod;
}
return ans;
}
ll calc(int a) {return 1LL*a*(a+1)%mod*500000004%mod;}
int main() {
int N=read(),M=read(),n=min(N,M),ans=0;
Euler(n);
for(int l=1,r=1;l<=n;l=r+1) {
r=min(N/(N/l),M/(M/l));
ans=(1LL*ans+(1LL*(calc(r)-calc(l-1))%mod+mod)%mod
*1LL*g(N/l,M/l,min(N/l,M/l)))%mod;
}
cout<<ans<<"\n";
// ans=0;
// for(int i=1;i<=N;++i) {
// for(int j=1;j<=M;++j) {
// ans=(ans+__gcd(i,j))%mod;
// }
// }
// cout<<ans;
return 0;
}
题目
类似的 差不多=多组询问的T1
https://www.luogu.org/problemnew/show/P2257
链接&&问题
\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==pri]\)
公式
\(\sum\limits_{k=1}^{N}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==k]\)
扣出\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==k]\)
啊哈,熟悉的套路
$ 此处省略,在T1或T2都有\(
\)ans=\sum\limits_{p=pri}^{min(N,M)} \sum\limits_{i=1}^{N/p}\mu(i)[\frac{N/p}{i}][\frac{M/p}{i}]\(
A了?1000组询问T飞了
\)\sum\limits_{p=pri} \sum\limits_{i=1}^{N/p}\mu(i)[\frac{N/p}{i}][\frac{M/p}{i}]\(
\)\sum\limits_{p=pri} \sum\limits_{i=1}^{N/p}\mu(\frac{k}{p})[\frac{N}{k}][\frac{M}{k}]\(
\)\sum\limits_{k=1}^{N}\sum\limits_{p=pri,p|k} \mu(\frac{k}{p})[\frac{N}{k}][\frac{M}{k}]\(
\)z(k)=\sum\limits_{p=pri,p|k} \mu(\frac{k}{p})$
线性筛预处理出z的前缀和就可以了
它的证明不错
https://orzsiyuan.com/articles/problem-Luogu-2257-YY-GCD/
代码
#include <algorithm>
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
const int N=10000007,mod=1e9+7;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int pri[N/10],mu[N],cnt,z[N];
bool vis[N];
void Euler(int n) {
vis[1]=mu[1]=1;
for(int i=2;i<=n;++i) {
if(!vis[i]) pri[++cnt]=i,mu[i]=-1,z[i]=mu[1];
for(int j=1;j<=cnt&&i*pri[j]<=n;++j) {
vis[ i*pri[j] ] = 1;
if(i % pri[j] == 0) {
mu[ i*pri[j] ] = 0;
z[ i*pri[j] ] = mu[i];
break;
} else {
mu[ i*pri[j] ] = -mu[i];
z[ i*pri[j] ] = -z[i] + mu[i];
}
}
}
for(int i=1;i<=n;++i) z[i]+=z[i-1];
}
int g(int N,int M,int n) {
ll ans=0;
for(int l=1,r=1;l<=n;l=r+1) {
r=min(N/(N/l),M/(M/l));
ans=ans+1LL*(z[r]-z[l-1])*(N/l)*(M/l);
}
return ans;
}
int main() {
Euler(10000000);
int T=read();
while(T--) {
int a=read(),b=read();
printf("%lld\n",g(a,b,min(a,b)));
}
return 0;
}
bzoj1101
链接
https://www.lydsy.com/JudgeOnline/problem.php?id=1101
式子
同楼上,或许,比他还要简单的多
代码
#include <algorithm>
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
const int N=100007,mod=1e9+7;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int pri[N/10],mu[N],cnt;
bool vis[N];
void Euler(int n) {
vis[1]=mu[1]=1;
for(int i=2;i<=n;++i) {
if(!vis[i]) pri[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*pri[j]<=n;++j) {
vis[ i*pri[j] ] = 1;
if(i % pri[j] == 0) {
mu[ i*pri[j] ] = 0;
break;
} else
mu[ i*pri[j] ] = -mu[i];
}
}
for(int i=1;i<=n;++i) mu[i]+=mu[i-1];
}
int g(int N,int M,int n) {
ll ans=0;
for(int l=1,r=1;l<=n;l=r+1) {
r=min(N/(N/l),M/(M/l));
ans=ans+1LL*(mu[r]-mu[l-1])*(N/l)*(M/l);
}
return ans;
}
int main() {
// freopen("11.in","r",stdin);
// freopen("a.out","w",stdout);
Euler(100000);
int T=read();
while(T--) {
int a=read(),b=read(),c=read();
printf("%lld\n",g(a/c,b/c,min(a/c,b/c)));
}
return 0;
}
GCD与莫比乌斯反演的勾当的更多相关文章
- 【BZOJ2820】YY的GCD(莫比乌斯反演)
[BZOJ2820]YY的GCD(莫比乌斯反演) 题面 讨厌权限题!!!提供洛谷题面 题解 单次询问\(O(n)\)是做过的一模一样的题目 但是现在很显然不行了, 于是继续推 \[ans=\sum_{ ...
- 【BZOJ2818】Gcd(莫比乌斯反演)
[BZOJ2818]Gcd(莫比乌斯反演) 题面 Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Ou ...
- 【HDU1695】GCD(莫比乌斯反演)
[HDU1695]GCD(莫比乌斯反演) 题面 题目大意 求\(a<=x<=b,c<=y<=d\) 且\(gcd(x,y)=k\)的无序数对的个数 其中,你可以假定\(a=c= ...
- hdu1695 GCD(莫比乌斯反演)
题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...
- HDU 1695 GCD (莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- acdream 1148 GCD SUM 莫比乌斯反演 ansx,ansy
GCD SUM Time Limit: 8000/4000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatis ...
- spoj 7001. Visible Lattice Points GCD问题 莫比乌斯反演
SPOJ Problem Set (classical) 7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N la ...
- hdu_1695: GCD 【莫比乌斯反演】
题目链接 这题求[1,n],[1,m]gcd为k的对数.而且没有顺序. 设F(n)为公约数为n的组数个数 f(n)为最大公约数为n的组数个数 然后在纸上手动验一下F(n)和f(n)的关系,直接套公式就 ...
- 【HDU4947】GCD Array (莫比乌斯反演+树状数组)
BUPT2017 wintertraining(15) #5H HDU- 4947 题意 有一个长度为l的数组,现在有m个操作,第1种为1 n d v,给下标x 满足gcd(x,n)=d的\(a_x\ ...
随机推荐
- PM2管理工具的使用
linux上PM2可以管理服务程序,防止程序无故关闭,具有程序守护功能,自动重启服务器程序,监控程序等好处,很方便,具体自己去体会! 官网地址: http://pm2.keymetrics.io/ ...
- 【Hadoop学习之四】HDFS HA搭建(QJM)
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 由于NameNode对于整个HDF ...
- 大数据处理框架之Strom:容错机制
1.集群节点宕机Nimbus服务器 单点故障,大部分时间是闲置的,在supervisor挂掉时会影响,所以宕机影响不大,重启即可非Nimbus服务器 故障时,该节点上所有Task任务都会超时,Nimb ...
- 理解本真的 REST 架构风格
1. http://kb.cnblogs.com/page/186516/ 2. http://www.infoq.com/cn/articles/rest-introduction 3. http: ...
- python 修改xml文档 ing
原xml文件 <?xml version="1.0" encoding="utf-8"?> <catalog> <maxid> ...
- 只打开一次浏览器,生成html测试报告<小紧张中......>
from selenium import webdriverimport unittestimport time class Blog(unittest.TestCase): "" ...
- 75.Java异常处理机制throws
package testDate; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IO ...
- flask框架----flask基础
知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref,werkzeug,uwsgi 2.实例化Flask对象,里面是有参数的 app = Flask(__name__,templ ...
- 基于Redis实现分布式锁实战
背景在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等.大部分的解决方案是基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端 ...
- PHP5.4以下的json_encode中文被转码的问题
PHP的json_encode中文被转码的问题 在php5.2中做json_encode的时候.中文会被unicode编码, php5.3加入了options参数, 5.4以后才加入JSON_UN ...