【BZOJ2154】Crash的数字表格(莫比乌斯反演)

题面

BZOJ

简化题意:

给定\(n,m\)

求$$\sum_{i=1}n\sum_{j=1}mlcm(i,j)$$

题解

以下的一切都默认\(n<m\)

我们都知道\(lcm(i,j)=\frac{ij}{gcd(i,j)}\)

所以所求化简

\[\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{gcd(i,j)}
\]

看到\(gcd(i,j)\)很不爽,于是就再提出来

\[\sum_{d=1}^{n}\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d]\frac{ij}{d}
\]

也就是

\[\sum_{d=1}^{n}\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)==1]{ijd}
\]

把\(d\)提出来

\[ans=\sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)==1]{ij}
\]

前面这一堆看起来管不了了

看后面的一段

\[\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)==1]{ij}
\]

看到\(n/d\)这种东西很不爽呀

就写成这样吧。。

\[\sum_{i=1}^{x}\sum_{j=1}^{y}[gcd(i,j)==1]{ij}
\]

这种东西怎么求?

令$$f(d)=\sum_{i=1}{x}\sum_{j=1}{y}[gcd(i,j)==d]{ij}$$

根据莫比乌斯反演的常见套路

\[G(d)=\sum_{i=1}^{x}\sum_{j=1}^{y}[d|gcd(i,j)]{ij}
\]

直接把\(d\)提出来

\[G(d)=d^2\sum_{i=1}^{x/d}\sum_{j=1}^{y/d}[1|gcd(i,j)]{ij}
\]

\(1|gcd(i,j)\)是显然成立的

所以$$G(d)=d2\sum_{i=1}{x/d}\sum_{j=1}^{y/d}{ij}$$

这玩意明显可以\(O(1)\)求(相当于两个等差数列相乘)

所以,要求的东西就是$$f(1)=\sum_{i=1}^x\mu(i)G(i)$$

这道题就解决了一大半了

现在我们的复杂度是\(O(n\sqrt n)\)与\(O(n^2)\)之间

需要继续优化

很显然的

\[ans=\sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)==1]{ij}
\]

这个式子可以数论分块一波,复杂度少了\(O(\sqrt n)\)

还不够

继续看,

\[f(1)=\sum_{i=1}^x\mu(i)G(i)
\]

这个式子把\(G(x)\)展开

\[f(1)=\sum_{i=1}^x\mu(i)i^2\sum_{i=1}^{x/d}\sum_{j=1}^{y/d}{ij}
\]

还是可以数论分块

但是要预处理\(\mu(i)*i^2\)的前缀和

然后复杂度就成了\(O(n)\)啦

注释掉的是没用数论分块的式子

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MOD 20101009
#define MAX 12000000
#define ll long long
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int mu[MAX],pri[MAX],tot;
bool zs[MAX];
int n,m;
int G[MAX],ans;
int smu[MAX],sqr[MAX];
void Getmu()
{
zs[1]=true;mu[1]=1;
for(int i=2;i<=n;++i)
{
if(!zs[i]){pri[++tot]=i;mu[i]=-1;}
for(int j=1;j<=tot&&i*pri[j]<=n;++j)
{
zs[i*pri[j]]=true;
if(i%pri[j])mu[i*pri[j]]=-mu[i];
else{mu[i*pri[j]]=0;break;}
}
}
for(int i=1;i<=n;++i)smu[i]=(smu[i-1]+mu[i]+MOD)%MOD;
}
int Solve(int xx,int yy)
{
long long ans=0;
//for(int i=1;i<=xx;++i)G[i]=1ll*i*i%MOD*1ll*(1ll*(1+xx/i)*(xx/i)/2%MOD)*(1ll*(1+yy/i)*(yy/i)/2%MOD)%MOD;
//for(int i=1;i<=xx;++i)ans=(ans+1ll*mu[i]*G[i]%MOD+MOD)%MOD;
int i=1,j;
while(i<=xx)
{
j=min(xx/(xx/i),yy/(yy/i));
int GG=1ll*(1ll*(1+xx/i)*(xx/i)/2%MOD)*(1ll*(1+yy/i)*(yy/i)/2%MOD)%MOD;
ans+=1ll*(sqr[j]-sqr[i-1])%MOD*GG%MOD;
ans%=MOD;
i=j+1;
}
return (ans+MOD)%MOD;
}
int main()
{
n=read();m=read();
if(n>m)swap(n,m);
Getmu();
for(int i=1;i<=n;++i)sqr[i]=(sqr[i-1]+1ll*i*i%MOD*mu[i]%MOD+MOD)%MOD;
//for(int i=1;i<=n;++i)ans=1ll*((ans+1ll*i*Solve(n/i,m/i))%MOD)%MOD;
int i=1,j;
while(i<=n)
{
j=min(n/(n/i),m/(m/i));
int t=1ll*(i+j)*(j-i+1)/2%MOD;
ans=(ans+1ll*Solve(n/i,m/i)*t%MOD)%MOD;
i=j+1;
}
printf("%d\n",ans);
return 0;
}

【BZOJ2154】Crash的数字表格(莫比乌斯反演)的更多相关文章

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

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

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

  9. [bzoj2154]Crash的数字表格(mobius反演)

    题意:$\sum\limits_{i = 1}^n {\sum\limits_{j = 1}^m {lcm(i,j)} } $ 解题关键: $\sum\limits_{i = 1}^n {\sum\l ...

  10. 洛谷 - 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}\ ...

随机推荐

  1. ACE-6.1.0 linux 下的编译与安装步骤

    ACE-6.1.0 linux 下的编译与安装步骤  引用至http://www.cnblogs.com/liangxiaxu/archive/2013/03/07/2948417.html 1.从  ...

  2. 响应式框架Bootstrap

    概念:Bootstrap将会根据你的屏幕的大小来调整HTML元素的大小 -- 强调 响应式设计的概念. 通过响应式设计,你无需再为你的网站设计一个手机版的.它在任何尺寸的屏幕上看起来都会不错. Boo ...

  3. 脚本启用python虚拟环境

    #!/bin/bash rm -rf /data/website/activities/virtualenvvirtualenv --no-site-packages -p python3 /data ...

  4. HDU 6035(树形dp)

    题意略. 思路:有n * (n - 1) / 2这么多边,要枚举是不可能的,感觉和数据结构也沾不上边.再加上树上染色,以一条边上不同颜色作为这个边的值,这看起来像是算贡献那种题,和17icpc沈阳的某 ...

  5. Java经典编程题50道之十三

    一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? public class Example13 {    public static void main(St ...

  6. Spring MVC中Session的正确用法之我见

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  7. 支持ipV6和ipV4的客户端编程

    ipv4和ipv6在socket初始化的时候是不一样的. ipv4 socket初始化: int CClient::InitSocket(CString strIP, short portNum) { ...

  8. qt 如何安装 Debuggers 调试器 ?

    1.下载 SDK 或 WDK 打开网址:https://developer.microsoft.com/zh-cn/windows/hardware/windows-driver-kit 选择 SDK ...

  9. UVA 816 bfs

    算法入门经典上面的题.题目链接 uva816 大致题意 有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点,求一条最短路(多解时任意输出一个即可).详细题意请看原题 思路 其实就是b ...

  10. ActiveMq笔记1-消息可靠性理论

    原博客:http://shift-alt-ctrl.iteye.com/blog/2020182 https://mp.weixin.qq.com/s/h74d6LtGB5M8VF0oLrXdCA 我 ...