当前位置: 首页 > news >正文

【做题记录】数论(马思博)

D. [国家集训队] Crash的数字表格 / JZPTAB

\[\begin{aligned} &\sum_{i=1}^{n}\sum_{j=1}^{m}\operatorname{lcm}(i,j)\\ =&\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{i\times j}{\gcd(i,j)}\\ =&\sum_{d=1}^{\min(n,m)}\frac{1}{d}\sum_{i=1}^{n}\sum_{j=1}^{m}i\times j\times[\gcd(i,j)=d]\\ \end{aligned} \]

不妨令 \(n\le m\),即

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

莫比乌斯反演,得

\[\begin{aligned} &\sum_{d=1}^{n}d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}i\times j\sum_{k\mid\gcd(i,j)}\mu(k)\\ =&\sum_{d=1}^{n}d\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\sum_{i=1}^{n}i\times[k\mid i]\sum_{j=1}^{m}j\times[k\mid j]\\ =&\sum_{d=1}^{n}d\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\times(k\times\frac{\lfloor\frac{n}{d\times k}\rfloor\times(\lfloor\frac{n}{d\times k}\rfloor+1)}{2})\times(k\times\frac{\lfloor\frac{m}{d\times k}\rfloor\times(\lfloor\frac{m}{d\times k}\rfloor+1)}{2}) \end{aligned} \]

于是可以调和级数求。预处理 \(i^2\)\(\frac{i\times(i+1)}{2}\) 减少取模即可。

Code
#include<bits/stdc++.h>
#define ll long long
#define il inline
using namespace std;
namespace asbt{
const int maxn=1e7+5,mod=20101009;
int n,m,prn,prm[maxn],mu[maxn],f[maxn],g[maxn];
bool npr[maxn];
il void euler(int n=1e7){mu[1]=npr[1]=1;for(int i=2;i<=n;i++){if(!npr[i]){prm[++prn]=i,mu[i]=-1;}for(int j=1;j<=prn&&i*1ll*prm[j]<=n;j++){npr[i*prm[j]]=1;if(i%prm[j]==0){mu[i*prm[j]]=0;break;}mu[i*prm[j]]=-mu[i];}}
}
il void init(int n=1e7){for(int i=1;i<=n;i++){f[i]=i*1ll*i%mod;g[i]=i*1ll*(i+1)/2%mod;}
}
int main(){ios::sync_with_stdio(0),cin.tie(0);euler(),init();cin>>n>>m;if(n>m){swap(n,m);}int ans=0;for(int i=1;i<=n;i++){int res=0;for(int j=1;j<=n/i;j++){int tmp=g[n/i/j]*1ll*g[m/i/j]%mod*f[j]%mod;if(mu[j]==1){(res+=tmp)%=mod;}else if(mu[j]==-1){(res+=mod-tmp)%=mod;}}ans=(res*1ll*i+ans)%mod;}cout<<ans;return 0;
}
}
int main(){return asbt::main();}

然而这还不够优秀。观察这个式子:

\[\begin{aligned} &\sum_{d=1}^{n}d\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\times(k\times\frac{\lfloor\frac{n}{d\times k}\rfloor\times(\lfloor\frac{n}{d\times k}\rfloor+1)}{2})\times(k\times\frac{\lfloor\frac{m}{d\times k}\rfloor\times(\lfloor\frac{m}{d\times k}\rfloor+1)}{2})\\ =&\sum_{d=1}^{n}d\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\times k^2\times\frac{\lfloor\frac{n}{d\times k}\rfloor\times(\lfloor\frac{n}{d\times k}\rfloor+1)}{2}\times\frac{\lfloor\frac{m}{d\times k}\rfloor\times(\lfloor\frac{m}{d\times k}\rfloor+1)}{2} \end{aligned} \]

考虑设 \(\operatorname{sum}(n,m)=\sum_{k=1}^{n}\mu(k)\times k^2\times\frac{\lfloor\frac{n}{k}\rfloor\times(\lfloor\frac{n}{k}\rfloor+1)}{2}\times\frac{\lfloor\frac{m}{k}\rfloor\times(\lfloor\frac{m}{k}\rfloor+1)}{2}\),给 \(\mu(k)\times k^2\) 做前缀和,可以数论分块做。于是原式变成:

\[\sum_{d=1}^{n}d\times\operatorname{sum}(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor) \]

这个东西还可以数论分块,于是时间复杂度线性。

Code
#include<bits/stdc++.h>
#define ll long long
#define il inline
using namespace std;
namespace asbt{
const int maxn=1e7+5,mod=20101009;
int n,m,prn,prm[maxn],mu[maxn],f[maxn],g[maxn],h[maxn];
bool npr[maxn];
il void euler(int n=1e7){mu[1]=npr[1]=1;for(int i=2;i<=n;i++){if(!npr[i]){prm[++prn]=i,mu[i]=-1;}for(int j=1;j<=prn&&i*1ll*prm[j]<=n;j++){npr[i*prm[j]]=1;if(i%prm[j]==0){mu[i*prm[j]]=0;break;}mu[i*prm[j]]=-mu[i];}}
}
il void init(int n=1e7){for(int i=1;i<=n;i++){f[i]=(f[i-1]+i)%mod;g[i]=((g[i-1]+mu[i]*1ll*i*i)%mod+mod)%mod;h[i]=i*1ll*(i+1)/2%mod;}
}
il int calc(int n,int m){int res=0;for(int i=1;i<=n;i++){int j=min(n/(n/i),m/(m/i));res=((g[j]-g[i-1]+mod)*1ll*h[n/i]%mod*h[m/i]+res)%mod;i=j;}return res;
}
int main(){ios::sync_with_stdio(0),cin.tie(0);euler(),init();cin>>n>>m;if(n>m){swap(n,m);}int ans=0;for(int i=1;i<=n;i++){int j=min(n/(n/i),m/(m/i));ans=((f[j]-f[i-1]+mod)*1ll*calc(n/i,m/i)+ans)%mod;i=j;}cout<<ans;return 0;
}
}
int main(){return asbt::main();}
http://www.sczhlp.com/news/10521/

相关文章:

  • 渗透测试十年回忆录:从漏洞扫描到社会工程的艺术
  • xx-准备工作
  • 月份选择每个月不能重复
  • 基于MATLAB实现的随机森林算法对共享单车签入签出数量进行预测
  • 8 月考试
  • .net MVC4中提示Newtonsoft.Json, Version=4.5.0.0
  • MySQL 并发控制和日志
  • 基于幅度的和差测角程序
  • ZR 25 summer D7T1 题解 | 树上问题,dp
  • EditText如何设置
  • 关于 git reset --hard 引发的代码故障(附故障原因及解决方案)
  • 【典型案例】利用高光谱遥感技术进行稀有矿产勘探 - ENVI
  • 学 STM32 第一步:入门工具怎么选?避免新手常见误区
  • Flutter 布局控件使用详解 - 指南
  • LHA6958D是ADS8588的代替料
  • 惠普笔记本电脑开机黑屏,一直响三长两短的滴滴声
  • selinux
  • 【转】Windows Server 系统的桌面上显示 此电脑 图标
  • hj_2025_0812
  • CF2062G Permutation Factory 题解
  • NBD(Network Block Device)简介及基本使用
  • 2024年12月齐鲁弱校联考
  • SpingBoot分段输出日志并自动删除
  • GLM4.5V视觉模型小试牛刀
  • 牛x,这也许是Coze(字节)平替,AIFlowy:企业级AI应用开发平台
  • Petrozavodsk Summer 2024. Day 2. K-ontest
  • pygame小游戏飞机大战_6敌人开火
  • Git 如何正确回滚代码?常见回滚操作对比,适用不同的场景
  • 嵌入式数据库_sqlite-duckdb
  • 抱歉!Java面试标准答案最不重要