求:

\(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的数字表格 - 莫比乌斯反演的更多相关文章

  1. bzoj2154||洛谷P1829 Crash的数字表格&&JZPTAB && bzoj3309 DZY Loves Math

    bzoj2154||洛谷P1829 https://www.lydsy.com/JudgeOnline/problem.php?id=2154 https://www.luogu.org/proble ...

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

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

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

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

  4. [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, ...

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

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

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

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

  7. 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 ...

  8. 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, ...

  9. [国家集训队] 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} ...

随机推荐

  1. 图像处理之opencv---加减乘除运算cvdiv

    http://chyyeng.blog.163.com/blog/static/16918230201211632135456/

  2. 【转】IDA远程调试 The debugger could not attach to the selected process. irs_recv 等待的操作过时

    IDA连接android_server 选中进程点ok之后 连接不上报错 The debugger could not attach to the selected process. This can ...

  3. EasyDarwin开发的短视频拍摄、录制开源项目EasyVideoRecorder

    在前面的博客<EasyDarwin开发出类似于美拍.秒拍的短视频拍摄SDK:EasyVideoRecorder>和<美拍.秒拍中安卓.IOS短视频拍摄的一些关键技术>中我们简单 ...

  4. 怎么实现单击span时给span添加边框

    说明: 1.开发环境 vs2012 asp.net mvc4 c# 1.效果图 2.html 前端代码 <%@ Page Language="C#" AutoEventWir ...

  5. linux socket send和recv、write和read

    1 recv和read ssize_t recv(int sockfd, void *buf, size_t len, int flags); ssize_t read(int fd, void *b ...

  6. 正则表达式测试工具之Regex Match Tracer

    下载地址:http://www.regex-match-tracer.com/downloads 使用示例1:匹配 使用示例2:替换

  7. SAP bseg 使用注意点:1.不要使用;2.有主键再用,

    粗表-簇表 cluster-table BSEGRFBLG 池表 pool-table 我記的沒錯的話,在21天學會ABAP中有一節是專門在講Cluster table,另外在 www.sapfans ...

  8. src源dst目标

    dst是destination的缩写,表目的 src是source的缩写,表源

  9. BZOJ 2002 Bounce 弹飞绵羊 —— 分块算法

    题目链接:https://vjudge.net/problem/HYSBZ-2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Li ...

  10. poj2773 —— 二分 + 容斥原理 + 唯一分解定理

    题目链接:http://poj.org/problem?id=2773 Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submi ...