洛谷 - P1829 - Crash的数字表格 - 莫比乌斯反演
求:
\(S(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}lcm(i,j)\)
显然:
\(S(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\frac{ij}{gcd(i,j)}\)
枚举g:
\(S(n,m)=\sum\limits_{g=1}^{n}\frac{1}{g}\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}ij[gcd(i,j)==g]\)
除以g:
\(S(n,m)=\sum\limits_{g=1}^{n}g\sum\limits_{i=1}^{\lfloor\frac{n}{g}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{g}\rfloor}ij[gcd(i,j)==1]\)
记:
\(S_1(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}ij[gcd(i,j)==1]\)
原式:
\(S(n,m)=\sum\limits_{g=1}^{n}gS_1(\lfloor\frac{n}{g}\rfloor,\lfloor\frac{m}{g}\rfloor)\)
化简\(S_1(n,m)\),显然:
\(S_1(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}ij\sum\limits_{k|gcd(i,j)}\mu(k)\)
枚举k:
\(S_1(n,m)=\sum\limits_{k=1}^{min}\mu(k)\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}ij[k|gcd(i,j)]\)
显然:
\(S_1(n,m)=\sum\limits_{k=1}^{min}\mu(k)\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}ij[k|i][k|j]\)
这种时候可以除以k:
\(S_1(n,m)=\sum\limits_{k=1}^{min}\mu(k)k^2\sum\limits_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{k}\rfloor}ij[1|i][1|j]\)
即:
\(S_1(n,m)=\sum\limits_{k=1}^{min}\mu(k)k^2\sum\limits_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{k}\rfloor}ij\)
记:
\(S_2(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}ij\)
原式:
\(S_1(n,m)=\sum\limits_{k=1}^{min}\mu(k)k^2S_2(\lfloor\frac{n}{k}\rfloor,\lfloor\frac{m}{k}\rfloor)\)
显然:
\(S_2(n,m)=\sum\limits_{i=1}^{n}i\sum\limits_{j=1}^{m}j\)
即:
\(S_2(n,m)=\frac{1}{4}n(n+1)m(m+1)\)
时间复杂度:
求\(S_2(n,m)\)是\(O(1)\),分块求\(S_1(n,m)\)是\(O(n^{\frac{1}{2}})\)(大概),分块求\(S(n,m)\)是\(O(n)\)(大概)。
还需要线性筛出:\(\sum\limits_{k=1}^{min}\mu(k)k^2\)
线性筛已经足够了,还好写,不过为什么不试一波杜教筛呢?
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=20101009;
const int MAXN=1e7;
int pri[MAXN+1];
int &pritop=pri[0];
int A[MAXN+1];
int pk[MAXN+1];
void sieve(int n=MAXN) {
pk[1]=1;
A[1]=1;
for(int i=2; i<=n; i++) {
if(!pri[i]) {
pri[++pritop]=i;
pk[i]=i;
ll tmp=1ll*i*i;
if(tmp>=mod)
tmp%=mod;
tmp=-tmp;
if(tmp<mod)
tmp+=mod;
A[i]=tmp;
}
for(int j=1; j<=pritop; j++) {
int &p=pri[j];
int t=i*p;
if(t>n)
break;
pri[t]=1;
if(i%p) {
pk[t]=p;
ll tmp=1ll*A[i]*A[p];
if(tmp>=mod)
tmp%=mod;
A[t]=tmp;
} else {
pk[t]=pk[i]*p;
if(pk[t]==t) {
A[t]=0;
} else {
ll tmp=1ll*A[t/pk[t]]*A[pk[t]];
if(tmp>=mod)
tmp%=mod;
A[t]=tmp;
}
break;
}
}
}
for(int i=1; i<=n; i++) {
A[i]+=A[i-1];
if(A[i]>=mod)
A[i]-=mod;
}
}
inline int qpow(ll x,int n) {
ll res=1;
while(n) {
if(n&1) {
res*=x;
if(res>=mod)
res%=mod;
}
x*=x;
if(x>=mod)
x%=mod;
n>>=1;
}
return res;
}
const int inv4=qpow(4,mod-2);
inline int S2(int n,int m) {
ll res=1ll*n*(n+1);
if(res>=mod)
res%=mod;
res*=m;
if(res>=mod)
res%=mod;
res*=(m+1);
if(res>=mod)
res%=mod;
res*=inv4;
if(res>=mod)
res%=mod;
return res;
}
inline int S1(int n,int m) {
ll res=0;
int nm=min(n,m);
for(int l=1,r; l<=nm; l=r+1) {
int tn=n/l;
int tm=m/l;
r=min(n/tn,m/tm);
ll tmp=A[r]-A[l-1];
if(tmp<0)
tmp+=mod;
tmp*=S2(tn,tm);
if(tmp>=mod)
tmp%=mod;
res+=tmp;
}
if(res>=mod)
res%=mod;
return res;
}
inline int s1(int l,int r) {
ll res=(1ll*(l+r)*(r-l+1))>>1;
if(res>=mod)
res%=mod;
return res;
}
inline int S(int n,int m) {
ll res=0;
int nm=min(n,m);
for(int l=1,r; l<=nm; l=r+1) {
int tn=n/l;
int tm=m/l;
r=min(n/tn,m/tm);
ll tmp=s1(l,r);
tmp*=S1(tn,tm);
if(tmp>=mod)
tmp%=mod;
res+=tmp;
}
if(res>=mod)
res%=mod;
return res;
}
int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
int n,m;
scanf("%d%d",&n,&m);
sieve(max(n,m));
printf("%d\n",S(n,m));
return 0;
}
杜教筛还是非常快的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=20101009;
//杜教筛
const int MAXN=pow(1e7,2.0/3.0)+1;
int pri[MAXN+1];
int &pritop=pri[0];
int A[MAXN+1];
int pk[MAXN+1];
void sieve(int n=MAXN) {
pk[1]=1;
A[1]=1;
for(int i=2; i<=n; i++) {
if(!pri[i]) {
pri[++pritop]=i;
pk[i]=i;
ll tmp=1ll*i*i;
if(tmp>=mod)
tmp%=mod;
tmp=-tmp;
if(tmp<mod)
tmp+=mod;
A[i]=tmp;
}
for(int j=1; j<=pritop; j++) {
int &p=pri[j];
int t=i*p;
if(t>n)
break;
pri[t]=1;
if(i%p) {
pk[t]=p;
ll tmp=1ll*A[i]*A[p];
if(tmp>=mod)
tmp%=mod;
A[t]=tmp;
} else {
pk[t]=pk[i]*p;
if(pk[t]==t) {
A[t]=0;
} else {
ll tmp=1ll*A[t/pk[t]]*A[pk[t]];
if(tmp>=mod)
tmp%=mod;
A[t]=tmp;
}
break;
}
}
}
for(int i=1; i<=n; i++) {
A[i]+=A[i-1];
if(A[i]>=mod)
A[i]-=mod;
}
}
inline int qpow(ll x,int n) {
ll res=1;
while(n) {
if(n&1) {
res*=x;
if(res>=mod)
res%=mod;
}
x*=x;
if(x>=mod)
x%=mod;
n>>=1;
}
return res;
}
const int inv4=qpow(4,mod-2);
inline int S2(int n,int m) {
ll res=1ll*n*(n+1);
if(res>=mod)
res%=mod;
res*=m;
if(res>=mod)
res%=mod;
res*=(m+1);
if(res>=mod)
res%=mod;
res*=inv4;
if(res>=mod)
res%=mod;
return res;
}
const int inv6=qpow(6,mod-2);
inline int s2(int n) {
ll res=1ll*n*(n+1);
if(res>=mod)
res%=mod;
res*=(2ll*n+1);
if(res>=mod)
res%=mod;
res*=inv6;
if(res>=mod)
res%=mod;
return res;
}
unordered_map<int,int> GA;
inline int Get_A(int n){
if(n<=MAXN)
return A[n];
if(GA.count(n))
return GA[n];
ll res=1;
for(int l=2,r;l<=n;l=r+1){
int t=n/l;
r=n/t;
ll tmp=s2(r)-s2(l-1);
if(tmp<0)
tmp+=mod;
tmp*=Get_A(t);
if(tmp>=mod)
tmp%=mod;
res-=tmp;
}
res%=mod;
if(res<0)
res+=mod;
return GA[n]=res;
}
inline int S1(int n,int m) {
ll res=0;
int nm=min(n,m);
for(int l=1,r; l<=nm; l=r+1) {
int tn=n/l;
int tm=m/l;
r=min(n/tn,m/tm);
ll tmp=Get_A(r)-Get_A(l-1);
if(tmp<0)
tmp+=mod;
tmp*=S2(tn,tm);
if(tmp>=mod)
tmp%=mod;
res+=tmp;
}
if(res>=mod)
res%=mod;
return res;
}
inline int s1(int l,int r) {
ll res=(1ll*(l+r)*(r-l+1))>>1;
if(res>=mod)
res%=mod;
return res;
}
inline int S(int n,int m) {
ll res=0;
int nm=min(n,m);
for(int l=1,r; l<=nm; l=r+1) {
int tn=n/l;
int tm=m/l;
r=min(n/tn,m/tm);
ll tmp=s1(l,r);
tmp*=S1(tn,tm);
if(tmp>=mod)
tmp%=mod;
res+=tmp;
}
if(res>=mod)
res%=mod;
return res;
}
int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
int n,m;
scanf("%d%d",&n,&m);
sieve();
printf("%d\n",S(n,m));
return 0;
}

洛谷 - P1829 - Crash的数字表格 - 莫比乌斯反演的更多相关文章
- bzoj2154||洛谷P1829 Crash的数字表格&&JZPTAB && bzoj3309 DZY Loves Math
bzoj2154||洛谷P1829 https://www.lydsy.com/JudgeOnline/problem.php?id=2154 https://www.luogu.org/proble ...
- [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)
[BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...
- BZOJ 2154: Crash的数字表格 [莫比乌斯反演]
2154: Crash的数字表格 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2924 Solved: 1091[Submit][Status][ ...
- [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∑Ny=1∑Mlim(x, ...
- 【bzoj2154】Crash的数字表格 莫比乌斯反演
题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, ...
- 【BZOJ】2154: Crash的数字表格 莫比乌斯反演
[题意]给定n,m,求Σlcm(i,j),1<=i<=n,1<=j<=m,n,m<=10^7. [算法]数论(莫比乌斯反演) [题解] $$ans=\sum_{i\leq ...
- bzoj2154: Crash的数字表格 莫比乌斯反演
题意:求\(\sum_{i=1}^n \sum_{j=1}^m\frac{i*j}{gcd(i,j)}\) 题解:\(ans=\sum_{i=1}^n\sum_{j=1}^m \frac{i*j}{g ...
- 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, ...
- [国家集训队] 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} ...
随机推荐
- 解决Android Studio下Element layer-list must be declared问题
近期将一个项目从Eclipse转到Android Studio. 项目中使用了环信demo中的一些xml资源,转换后发现color资源目录下诸如layer-list或者shape等标签报Element ...
- 关于Darwin接入私有协议、私有SDK码流的讨论
最近做到云视频/云监控的项目,跟团队伙伴讨论到一个架构问题,就是将私有协议的码流数据接入到Darwin,再通过Darwin对外提供高效的RTSP/RTP服务.说到私有协议接入Darwin, ...
- ffmpeg推送,EasyDarwin转发,vlc播放 实现整个RTSP直播
部署EasyDarwin流媒体服务器 ffmpeg推送摄像机视频到EasyDarwin VLC播放 第一步:部署EasyDarwin流媒体服务器 EasyDarwin的部署过程我们就不再赘述了,在Ea ...
- 关于java的线程
1 java的线程也是一个对象 所以,java线程对象也是由gc销毁的. 2 java线程对象等待被销毁的时机 当java线程执行完run()方法之后就在等待被销毁了,所以要一个线程对象不被销毁唯一的 ...
- Understanding Unicorn and unicorn-worker-killer Unicorn
We just wrote some new documentation on how Gitlab uses Unicorn and unicorn-worker-killer, available ...
- Ahead-of-time compilation
https://en.wikipedia.org/wiki/Ahead-of-time_compilation
- grouped differently across partitions
[熵增] 由无序到有序 http://spark.apache.org/docs/latest/rdd-programming-guide.html#shuffle-operations Shuffl ...
- DuiLib笔记,基于WindowImplBase的基础模板
Main.cpp #include <UIlib.h> using namespace DuiLib; class MainWindow : public WindowImplBase { ...
- ArcGIS10和ArcGIS10.1关于AO Licence初始化的问题
两个版本主要是esriLicenseProductCode.esriLicenseProductCodeArcInfo和esriLicenseProductCode.esriLicenseProduc ...
- firefox coap安装使用
coap 插件: 百度搜索firefox coap也能找到该插件https://addons.mozilla.org/zh-CN/firefox/addon/copper-270430/在firefo ...