[BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

题面

\[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)
\]

分析

\[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)
\]

\[=\sum_{i=1}^{n} \sum_{j=1}^{m} \frac{i j}{\mathrm{gcd}(i, j)}
\]

\[=\sum_{g=1}^{n} \sum_{i=1}^{n/g} \sum_{j=1}^{m/g} \frac{ig \times jg}{g}[\gcd(i,j)=1]
\]

(改变求和顺序,先枚举g,i相当于之前的i/g,j相当于j/g,所以gcd(i,j)=1)

\[=\sum_{g=1}^{n}g\sum_{i=1}^{n/g} \sum_{j=1}^{m/g} i j[gcd(i,j)=1]\ \ \ (把g提到外面)
\]

令$$f(x)=\sum_{i=1}^{n/g} \sum_{j=1}^{m/g} ij[gcd(i,j)=x]$$

莫比乌斯反演的套路,$$F(x)=\sum_{i=1}^{n/g} \sum_{j=1}^{m/g} ij[x|gcd(i,j)]$$

\(\because x|gcd(i,j),\therefore i|x,j|x\)

\[\therefore F(x)=\sum_{i|x}^{n/g} \sum_{j|x}^{m/g}ij=x^2\sum_{i=1}^{\frac{n}{gx}} \sum_{j=1}^{\frac{m}{gx}} ij=x^2\sum_{i=1}^{\frac{n}{gx}} i\sum_{j=1}^{\frac{m}{gx}} j
\]

用等差数列求和公式可以\(O(1)\)求出,这里为了形式美观先不展开

显然\(F,f\)满足莫比乌斯反演的倍数形式,\(F(n)=\sum_{n|d}f(d)\)

因此\(f(n)=\sum_{n|d} F(d)\mu(\frac{d}{n})\)

我们要求的是\(f(1)\)

\[f(1)=\sum_{1|d}F(d) \mu(d)=\sum_{d=1}^{n/g} F(d) \mu(d)=\sum_{d=1}^n \mu(d) d^2 \sum_{i=1}^{\frac{n}{gd}} i\sum_{j=1}^{\frac{m}{gd}} j
\]

\[\therefore 原式=\sum_{g=1}^{n} g \sum_{d=1}^{n} \mu(d) d^{2} \sum_{i=1}^{\frac{n}{gd}} i \sum_{j=1}^{\frac{m}{gd}} j
\]

\[=\sum_{g=1}^{n} g \sum_{d=1}^{n/g} \mu(d) d^{2} \frac{\frac{n}{gd}\left(\frac{gn}{d}+1\right)}{2} \cdot \frac{\frac{m}{gd}\left(\frac{m}{gd}+1\right)}{2} \ \ \ (等差数列求和公式)
\]

看起来时间复杂度是\(O(n^2)\)的,但我们只要线性筛出\(\mu(d)d^2\),两层求和其实都可以数论分块求解,时间复杂度\(O(\sqrt{n}\times \sqrt{n})=O(n)\)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 10000000
#define mod 20101009//不是1e9+7!!!
using namespace std;
typedef long long ll;
int cnt;
bool vis[maxn+5];
int prime[maxn+5];
int mu[maxn+5];
ll sumg[maxn+5];//g(n)=n*n*mu(n)
void sieve(int n){
mu[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){
prime[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}else mu[i*prime[j]]=-mu[i];
}
}
for(int i=1;i<=n;i++) sumg[i]=(sumg[i-1]+(ll)i*i%mod*mu[i]%mod)%mod;
} inline ll fast_pow(ll x,ll k){
ll ans=1;
while(k){
if(k&1) ans=ans*x%mod;
x=x*x%mod;
k>>=1;
}
return ans;
}
inline ll inv(ll x){
return fast_pow(x,mod-2);
} ll n,m;
ll inv2;
inline ll S(ll n){
return n*(n+1)%mod*inv2%mod;
}
ll calc(int n,int m){//其实就是f(x)
ll ans=0;
for(int l=1,r;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
ans+=(sumg[r]-sumg[l-1])*S(n/l)%mod*S(m/l)%mod;
ans=(ans+mod)%mod;//注意mu可能为负数
}
return ans;
} int main(){
sieve(maxn);
inv2=inv(2);
scanf("%lld %lld",&n,&m);
if(n>m) swap(n,m);
ll ans=0;
for(int l=1,r;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
ans+=(ll)(l+r)*(r-l+1)%mod*inv2%mod*calc(n/l,m/l)%mod;
ans=(ans+mod)%mod;
}
printf("%lld\n",ans);
}

[BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)的更多相关文章

  1. [bzoj 2693] jzptab & [bzoj 2154] Crash的数字表格 (莫比乌斯反演)

    题目描述 TTT组数据,给出NNN,MMM,求∑x=1N∑y=1Mlim(x,y)\sum_{x=1}^N\sum_{y=1}^M lim(x,y)\newlinex=1∑N​y=1∑M​lim(x, ...

  2. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][ ...

  3. BZOJ 2154 Crash的数字表格 ——莫比乌斯反演

    求$\sum_{i=1}^n\sum_{j=1}^n lcm(i,j)$ 枚举因数 $ans=\sum_{d<=n} F(d) * d$ $F(d)$表示给定范围内两两$\sum_{gcd(i, ...

  4. 【BZOJ】2154: Crash的数字表格 莫比乌斯反演

    [题意]给定n,m,求Σlcm(i,j),1<=i<=n,1<=j<=m,n,m<=10^7. [算法]数论(莫比乌斯反演) [题解] $$ans=\sum_{i\leq ...

  5. [国家集训队] Crash的数字表格 - 莫比乌斯反演,整除分块

    考虑到\(lcm(i,j)=\frac{ij}{gcd(i,j)}\) \(\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)}\) \(\sum_{d=1}^{n} ...

  6. 【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&&BZOJ 2693 jzptab)

    BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b ...

  7. Bzoj 2154: Crash的数字表格(积性函数)

    2154: Crash的数字表格 Time Limit: 20 Sec Memory Limit: 259 MB Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least ...

  8. 【刷题】BZOJ 2154 Crash的数字表格

    Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如 ...

  9. 【bzoj2154】Crash的数字表格 莫比乌斯反演

    题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, ...

随机推荐

  1. sudo: pip:command not found问题解决

    python3 sudo apt-get install python3-pip python2 sudo apt-get install python-pip如果还是不行,则按照下面操作 原因:编译 ...

  2. HTML5测试(一)

    HTML5测试一 1. 问题:HTML5 之前的 HTML 版本是什么? A.HTML 4.01 B.HTML 4 C.HTML 4.1 D.HTML 4.9 答案:A HTML5 是 HTML 最新 ...

  3. windows 环境如何启动 redis ?

    1.cd 到 redis 的安装目录 C:\Users\dell>cd C:\redis 2.执行 redis 启动命令 C:\redis>redis-server.exe redis.w ...

  4. Codeforces Round #345 (Div. 2) E. Table Compression 并查集+智商题

    E. Table Compression time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  5. 186. [USACO Oct08] 牧场旅行 (第三次考试大整理)

    186. [USACO Oct08] 牧场旅行 输入文件:pwalk.in   输出文件:pwalk.out   简单对比 时间限制:1 s   内存限制:128 MB n个被自然地编号为1..n奶牛 ...

  6. k8s安装报错 Error: unknown flag: --experimental-upload-certs

    今天安装k8sV1.16的版本时候,执行突然发现命令不对,之前安装V1.15的时候是可以的,可能是版本升级的原因. 解决: unknown flag: --experimental-upload-ce ...

  7. Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks(用于深度网络快速适应的元学习)

    摘要:我们提出了一种不依赖模型的元学习算法,它与任何梯度下降训练的模型兼容,适用于各种不同的学习问题,包括分类.回归和强化学习.元学习的目标是在各种学习任务上训练一个模型,这样它只需要少量的训练样本就 ...

  8. 在Eclipse中搭建Android开发环境

    忙活了两天多的时间,终于在Eclipse中成功搭建了Android开发环境,着实不易啊!! 原本我用的编译器是MyEclipse的,但是从网上找不到如何在MyEclipse中搭建环境,于是乎就换了Ec ...

  9. Python的 counter内置函数,统计文本中的单词数量

    counter是 colletions内的一个类 可以理解为一个简单的计数 import collections str1=['a','a','b','d'] m=collections.Counte ...

  10. SVN重命名后,不允许提交

    在vs中对文件名重命名后,导致不能提交 解决: 在源码根目录下提交源码,提交完毕后,再使用如下菜单对需要命名的单个文件进行重命名,重命名完毕后,在源码根目录下提交源码即可