机房最后一个学懵逼钨丝的人

题目一

链接

题目没找到

求\(\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与莫比乌斯反演的勾当的更多相关文章

  1. 【BZOJ2820】YY的GCD(莫比乌斯反演)

    [BZOJ2820]YY的GCD(莫比乌斯反演) 题面 讨厌权限题!!!提供洛谷题面 题解 单次询问\(O(n)\)是做过的一模一样的题目 但是现在很显然不行了, 于是继续推 \[ans=\sum_{ ...

  2. 【BZOJ2818】Gcd(莫比乌斯反演)

    [BZOJ2818]Gcd(莫比乌斯反演) 题面 Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Ou ...

  3. 【HDU1695】GCD(莫比乌斯反演)

    [HDU1695]GCD(莫比乌斯反演) 题面 题目大意 求\(a<=x<=b,c<=y<=d\) 且\(gcd(x,y)=k\)的无序数对的个数 其中,你可以假定\(a=c= ...

  4. hdu1695 GCD(莫比乌斯反演)

    题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...

  5. HDU 1695 GCD (莫比乌斯反演)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  6. acdream 1148 GCD SUM 莫比乌斯反演 ansx,ansy

    GCD SUM Time Limit: 8000/4000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatis ...

  7. spoj 7001. Visible Lattice Points GCD问题 莫比乌斯反演

    SPOJ Problem Set (classical) 7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N la ...

  8. hdu_1695: GCD 【莫比乌斯反演】

    题目链接 这题求[1,n],[1,m]gcd为k的对数.而且没有顺序. 设F(n)为公约数为n的组数个数 f(n)为最大公约数为n的组数个数 然后在纸上手动验一下F(n)和f(n)的关系,直接套公式就 ...

  9. 【HDU4947】GCD Array (莫比乌斯反演+树状数组)

    BUPT2017 wintertraining(15) #5H HDU- 4947 题意 有一个长度为l的数组,现在有m个操作,第1种为1 n d v,给下标x 满足gcd(x,n)=d的\(a_x\ ...

随机推荐

  1. 总结我在huawei matebook D 2018版中安装archlinux的过程

    1.首先当然是准备一个启动U盘.按理说UEFI启动方式,只要将ISO镜像中的文件copy到U盘根目录即可,可以实际用的时候虽然能启动,但是进入live的时候会有些问题,所以老老实实用UltraISO ...

  2. 在caffe-ssd的环境搭建中遇到报错信息:Makefile:588: recipe for target '.build_release/cuda/src/caffe/layers/softmax_loss_layer.o' failed

    错误原因: 1.计算机没有安装GPU 2.有GPU但是NVCCFLAGS设置错误 解决方法: 1.对没有GPU的计算机,需要将Makefile中的CPU之前的#注释去掉,是的caffe运行的处理器进行 ...

  3. ubuntu修改时区

    1.网上大部分解决办法是命令tzselect,然后选择亚洲-->中国->上海,但很遗憾,一点效果没有: 2.后找到解决办法,运行命令dpkg-reconfigure tzdata,选择As ...

  4. [12]Windows内核情景分析 --- MDI

    Mdl意为'内存映射描述符'.'缓冲描述符',一个mdl就代表一个缓冲.(任意一块物理内存,可以同时映射到用户地址空间和系统地址空间的) 设备IO方式分为三种:缓冲方式.直接IO方式.直接方式 缓冲方 ...

  5. sqlserver清除缓存,记录查询时间

    文章来至:https://www.cnblogs.com/50614090/p/4001464.html --1. 将当前数据库的全部脏页写入磁盘.“脏页”是已输入缓存区高速缓存且已修改但尚未写入磁盘 ...

  6. codeforces 975C Valhalla Siege

    题意: 有n个巫师站成一列,每个巫师有自己的血量. 一个人射箭攻击他们,每次造成若干点伤害,巫师按照给定的顺序承受伤害,如果伤害大了,那么死掉,伤害落到下一个巫师身上. 如果一轮攻击之后,所有的巫师都 ...

  7. c++学习笔记(七)- lambda表达式 迭代器 算法

    关于lambda表达式: 刷题的时候遇到一句代码不懂: char ch = *it;auto it2 = find_if(it, b.end(), [ch](char x){ return x != ...

  8. flask 自定义验证器(行内验证器、全局验证器)

    自定义验证器 在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,下面来看下编写自定义验证器. 行内验证器 除了使用WTForms提供的验证器来验证表单字段,我们还 ...

  9. Django框架----Ajax

    一.Ajax准备知识:json 说起json,我们大家都了解,就是python中的json模块,那么json模块具体是什么呢?那我们现在详细的来说明一下 1.json(Javascript  Obie ...

  10. How to Get Text inside a Canvas using Webdriver or Protractor

    https://stackoverflow.com/questions/43609429/how-to-get-text-inside-a-canvas-using-webdriver-or-prot ...