真正自己做出来的第一道莫反题祭~~~~
题意:
求∑ni=1∑mj=1(2gcd(i,j)−1)。
开始推式子:
n∑i=1m∑j=1(2gcd(i,j)−1)=2n∑i=1m∑j=1gcd(i,j)−nm=2min(n,m)∑d=1n∑i=1m∑j=1d[gcd(i,j)=d]−nm=2min(n,m)∑d=1dn∑i=1m∑j=1[gcd(i,j)=d]−nm=2min(n,m)∑d=1dn/d∑i=1m/d∑j=1[gcd(i,j)=1]−nm=2min(n,m)∑d=1dn/d∑i=1m/d∑j=1∑x|gcd(i,j)μ(x)−nm=2min(n,m)∑d=1dn/d∑i=1m/d∑j=1∑x|i,x|jμ(x)−nm=2min(n,m)∑d=1dmin(n/d,m/d)∑x=1n/(dx)∑i=1m/(dx)∑j=1μ(x)−nm=2min(n,m)∑d=1dmin(n/d,m/d)∑x=1μ(x)n/(dx)∑i=1m/(dx)∑j=11−nm=2min(n,m)∑d=1dmin(n/d,m/d)∑x=1μ(x)⌊ndx⌋⌊mdx⌋−nm
到这里为止,就已经可以做了。
复杂度为(设n与m同级)O(∑ni=1√ni)≈O(n)。
但实际上还有O(√n)的做法(虽然预处理是O(n)的):
2∑min(n,m)d=1d∑min(n/d,m/d)x=1μ(x)⌊ndx⌋⌊mdx⌋−nm
设T=dx,则
原式=2min(n,m)∑T=1⌊nT⌋⌊mT⌋∑d|Tdμ(Td)−mn
这东西不还是O(n)的吗?
我们看一下后面的东西:∑d|Tdμ(Td),
我们规定一个函数id(x)=x,则这个东西=∑d|Tid(d)μ(Td)。
这个运算,有一个具体的名字,叫做狄利克雷卷积。它是这样的运算:
h(n)=(f∗g)(n)⇔h(n)=∑d|Tf(d)∗g(Td)。
这个运算,满足:
⎧⎨⎩1.交换律:f∗g=g∗f2.结合律:(f∗g)∗h=f∗(g∗h)3.分配律:h∗(f+g)=h∗f+h∗g
它的更多性质我们将在接下来一一提到。不过,在这道题中它最大的作用是帮助我们将上面的东西转成狄利克雷卷积的形式,即
原式=2min(n,m)∑T=1⌊nT⌋⌊mT⌋((id∗μ)(T))−mn
好好好,我们搞出了一个新的运算。但是这有什么用吗?
如果f和g都是积性函数,那么f∗g也是积性函数。
是积性函数就意味着我们可以用欧拉筛去筛它!
而我们已经知道了μ函数是积性函数。用脑子稍微想想也知道,id函数肯定是积性函数。
这意味着,id∗μ也是一个积性函数,可以用欧拉筛。
而这个东西前一半的东西可以整除分块。
那么我们就丧心病狂地把这个东西优化到了O(√n)。
尽管预处理还是O(n)的,但是已经很优秀了。感觉可以出成一道很毒瘤的题
先给出普通的O(n)的代码,而O(√n)的我们将在下一题中用到:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,mu[100100],pri[100100],res;
void getmu(int N){
mu[1]=1;
for(int i=2;i<=N;i++){
if(!pri[i])pri[++pri[0]]=i,mu[i]=-1;
for(int j=1;j<=pri[0]&&i*pri[j]<=N;j++){
pri[i*pri[j]]=true;
if(!(i%pri[j]))break;
mu[i*pri[j]]=-mu[i];
}
}
for(int i=1;i<=N;i++)mu[i]+=mu[i-1];
}
signed main(){
scanf("%lld%lld",&n,&m),getmu(min(n,m));
for(int i=1;i<=min(n,m);i++){
int x=n/i,y=m/i,lim=min(x,y),sum=0;
for(int l=1,r;l<=lim;l=r+1)r=min(x/(x/l),y/(y/l)),sum+=(x/l)*(y/l)*(mu[r]-mu[l-1]);
res+=2*i*sum;
}
res-=n*m;
printf("%lld\n",res);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?