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\ ...
随机推荐
- 500次访问之后php-cgi进程退出
之前遇到过php-cgi进程意外退出的问题,以为是负载过高导致的,这几天在写一个向数据库插数据的程序,测试稳定性时又遇到这种问题. 于是搜索,找到了这篇文章:http://stackoverflow. ...
- 面向对象的多态性(C++)
以C++为例三大特效:封装.继承.多态,面向对象的编程语言都具有这些特性. 那么本节来谈谈多态性,尽量说的简单些容易理解! 多态什么意思?即运行时多态,以相同的方式处理不同类型的对象,产生不同的结果! ...
- ueditor上传图片配置成功,但是如何删除无用的图片
我使用ueditor作为富文本编辑器,配置已经好了,上传功能也好了.现在的问题是当使用ueditor上传图片的时候,选择了图片就立刻上传到指定的文件夹里,而后续即使没有保存该篇文章内容,即取消操作,图 ...
- Lua用一维数组存储一个n阶方阵,输出这个方阵的正对角线上的数的和与反对角线上的数的和的差的绝对值。
arr = {, , , , , , , , -} function diagonalDifference(arr) dimesion = math.sqrt(#arr) arr1 = {} sum1 ...
- 【Linux学习九】负载均衡
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.高并发 随着应用访问量的增加,带来高并发处理问题. 具体有两个: ...
- L1正则和L2正则的比较分析详解
原文链接:https://blog.csdn.net/w5688414/article/details/78046960 范数(norm) 数学上,范数是一个向量空间或矩阵上所有向量的长度和大小的求和 ...
- redux 数据规律
counter increase info todos 为 reducers 文件名 export default combineReducers({ todos, visibilityFilter ...
- 转:异常处理之ThreadException、unhandledException及多线程异常处理
转载自:http://www.cnblogs.com/levin9/articles/2319251.html 一:ThreadException和unhandledException的区别 处理未捕 ...
- flask框架----flask-session组件
简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis:保存数 ...
- glog日志库移植Android平台
1.在linux平台下使用ndk交叉编译链编译glog生成libglog.a静态库. 2.将生成的库文件与头文件放到Android项目中,使用JNI方法调用. 3.编译遇到错误“stderr.stdo ...