求:
\(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 Yinkufreopen("Yinku.in","r",stdin);
#endif // Yinkuint 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 Yinkufreopen("Yinku.in","r",stdin);
#endif // Yinkuint n,m;scanf("%d%d",&n,&m);sieve();printf("%d\n",S(n,m));return 0;
}

转载于:https://www.cnblogs.com/Yinku/p/11004169.html

洛谷 - P1829 - Crash的数字表格 - 莫比乌斯反演相关推荐

  1. BZOJ 2154 Crash的数字表格 (莫比乌斯反演)

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

  2. 【BZOJ2154】Crash的数字表格 [莫比乌斯反演]

    Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MB [Submit][Status][Discuss] Description 今天的数学课上,Cr ...

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

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

  4. [BZOJ2154]Crash的数字表格 莫比乌斯反演

    orz PoPoQQQ 课件上的例题啊orzorz 话说这种根号划分的方法好像次次都有的样子orzorz http://wenku.baidu.com/link?url=RRtdDApIUqzKmUD ...

  5. 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)

    传送门 我们考虑容斥,设$ans(a,b)=\sum_{i=1}^a\sum_{j=1}^b[gcd(a,b)==k]$,这个东西可以和这一题一样去算洛谷P3455 [POI2007]ZAP-Quer ...

  6. #莫比乌斯反演,乘法逆元,快速幂,整除分块#JZOJ 100006 洛谷 3704 bzoj 4816 数字表格

    题目 求 ∏ i = 1 n ∏ j = 1 m F g c d ( i , j ) \prod_{i=1}^n\prod_{j=1}^mF_{gcd(i,j)} i=1∏n​j=1∏m​Fgcd(i ...

  7. BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...

  8. P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)

    [国家集训队]Crash的数字表格 / JZPTAB 题目描述 今天的数学课上,Crash 小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数 a a a 和 b b ...

  9. P1829 [国家集训队]Crash的数字表格(推了好久的mobius反演)

    P1829 [国家集训队]Crash的数字表格 / JZPTAB 推导过程 ∑i=1n∑j=1mlcm(i,j)\sum_{i = 1} ^{n} \sum_{j = 1} ^{m} lcm(i, j ...

最新文章

  1. 安卓学习-其他-文件读写
  2. 深度学习可解释性问题如何解决?图灵奖得主Bengio有一个解
  3. 广告计算——平滑CTR
  4. Linux之脚本执行
  5. java获取jtable的路径,Java如何在JTable组件中获取选定的单元格?
  6. 牛客题霸 [合并二叉树] C++题解/答案
  7. 利用Python定时给女友微信发送今日天气情况,异地恋维护感情神器
  8. Linux下文件系统目录结构
  9. Swift开发实例:苹果Swift编程语言新手教程中文版+FlappyBird,2048游戏源代码
  10. Linux学习总结(45)——Linux服务器出现卡慢的基本解决方法
  11. VMware15.0安装CentOS7
  12. 拥塞避免算法、快重传、快恢复、慢启动
  13. linux map内存在哪里分配,linux内存分配与回收
  14. 327、浏览历史数据库表设计与缓存设计
  15. 手机浏览器自动打开快应用?
  16. php 页面日历形式显示,日历页面展示-PHP制作阴阳历转换的日历插件-PHP中文网教程...
  17. 2019 东北四省赛部分题解 The 13th Chinese Northeast Collegiate Programming Contest
  18. 信号处理基本概念:单位脉冲响应和单位阶跃响应
  19. 让玩家提升游戏耐玩度的8个小技巧
  20. python3 scipy._lib.six

热门文章

  1. #20145238荆玉茗《网络对抗》-逆向及Bof进阶实践
  2. React的深入解密一
  3. 【虚拟机】虚拟机(Vmware)怎么进入BIOS
  4. 面试题----寻找比一个N位数大的“下”一个数
  5. 解决启动httpd报: apr_sockaddr_info_get() failed for错误
  6. java setmethod_Java Operation.setJavaMethod方法代码示例
  7. java 故障排查_目前最全的 Java 服务问题排查套路
  8. spss聚类分析_SPSS聚类分析 I K均值聚类法案例实操
  9. java程序实验总结_Java Socket 编程实验总结
  10. gan 总结 数据增强_[NLP]聊一聊,预处理和数据增强技术