求:

\(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. CASIO fx-991es Plus科学计算器使用技巧

    关于输出: 默认是按照自然书写格式显示的,计算结果是按照分数形式显示,如0.5x0.5,会显示=1/4.虽然很直观,但是在测量和估算上略有不便.此时用 SHIFT --> MODE (也就是se ...

  2. 对JavaBean创建的一点改进

    在看了<Effective Java>Item2中对JavaBean的描述后,再结合Item1和Builder模式,遂想有没有其他方式避免JavaBean创建的线程安全问题呢? 以如下Ja ...

  3. UVA 11888 - Abnormal 89&#39;s(Manachar)

    UVA 11888 - Abnormal 89's option=com_onlinejudge&Itemid=8&page=show_problem&category=524 ...

  4. jni集成第3方third party动态库libwebrtc_audio_preprocessing.so时android.mk的编写

    现在要调用一个第3方库libwebrtc_audio_preprocessing.so 最终布局如下: 即创建2个文件夹,将第3方库放进去. include目录放第3方库的头文件  其中lib目录如下 ...

  5. Ubuntu NDK配置与JNI demo

    NDK配置 1.下载最新版本NDK(android-ndk-r9d-linux-x86_64.tar.bz2) 下载网页:http://developer.android.com/tools/sdk/ ...

  6. linux的DNS相关介绍(转载)

    1.DNS配置文件 /etc/hosts   这个是最早的 hostname 对应 IP 的档案: /etc/resolv.conf :这个重要!就是 ISP 的 DNS 服务器 IP 记录处: /e ...

  7. HDU 4622 Reincarnation 后缀自动机 // BKDRHash(最优hash)

    Reincarnation Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) P ...

  8. Liquibase

    http://www.liquibase.org/documentation/index.html https://github.com/studygolang/studygolang/tree/ma ...

  9. Kotlin基本语法笔记3之定义类、继承及创建实例

    定义类 class MyObject private constructor(name: String, age: Int) { private var name: String private va ...

  10. 解决Error:Unable to find method 'org.gradle.api.internal.project.ProjectInternal.

    错误描述今天在Github上面下载了一份代码,然后导入到Android Studio中直接报错误 错误描述如下: Error: Unable to find method ‘org.gradle.ap ...