求:

\(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. poj 2154 Color < 组合数学+数论>

    链接:http://poj.org/problem?id=2154 题意:给出两个整数 N 和 P,表示 N 个珠子,N种颜色,要求不同的项链数, 结果 %p ~ 思路: 利用polya定理解~定理内 ...

  2. easyui datagrid 加载静态文件中的json数据

    本文主要介绍easyui datagrid 怎么加载静态文件里的json数据,开发环境vs2012, 一.json文件所处的位置 二.json文件内容 {"total":28,&q ...

  3. r squared

    multiple r squared adjusted r squared http://web.maths.unsw.edu.au/~adelle/Garvan/Assays/GoodnessOfF ...

  4. [P2769] 猴子上树

    题目描述 在猴村有一条笔直的山路,这条山路很窄,宽度忽略不计.有 n只猴子正站在山路上静静地观望今天来参加比赛的各位同学.用一个正整数Xi表示第i只猴子所站位置,任意两只猴子的所站位置互不相同.在这条 ...

  5. Javascript学习之Math对象详解

    1.定义 Math 是一个内置对象, 为数学常量和数学函数提供了属性和方法.  Math 不是一个函数对象 Math 不是一个构造器.  Math 的所有属性和方法都是静态的 2.属性 Math.E ...

  6. Impala 安装笔记1一Cloudera CDH4.3.0安装

    Impala是Cloudera在受到Google的Dremel启发下开发的实时交互SQL大数据查询工具,Impala没有再使用缓慢的Hive+MapReduce批处理,而是通过使用与商用并行关系数据库 ...

  7. Spring Boot缓存源码分析

    前言 项目里面要增加一个应用缓存,原本想着要怎么怎么来整合ehcache和springboot,做好准备配置这个配置那个,结果只需要做三件事: pom依赖 写好一个ehcache的配置文件 在boot ...

  8. [HAOI2016]找相同子串

    这题感觉有点坑啊. 题目还是不难想的,先对一个字符串建后缀自动机,然后拿另一个字符串在上面跑. 假设当前跑到了p点,匹配长度为len. 那么当前会对答案产生贡献的串是哪些呢? 显然当前会对p及p到根的 ...

  9. html5--5-3 给直线添加样式

    html5--5-3 给直线添加样式 学习要点 strokeStyle属性:设置颜色.渐变或模式(本节课只涉及到颜色) lineWidth属性:--设置线宽 Canvas的路径方法 moveTo() ...

  10. JDBCTool

    新建 *.properties属性文件,内容如下: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/dbName userna ...