博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[SDOI2015]约数个数和
阅读量:6403 次
发布时间:2019-06-23

本文共 2298 字,大约阅读时间需要 7 分钟。

[SDOI2015]约数个数和

解法

由于\(N,M\)的顺序对答案没影响

我们规定\(N<M\)
\(ans=\sum_{i=1}^N\sum_{j=1}^M d(ij)\)

给出一个结论

\[d(ij)=\sum_{x|i}\sum_{y|i}[gcd(x,y)=1]\]
所以
\[ans=\sum_{i=1}^N\sum_{j=1}^M\sum_{x|i}\sum_{y|i}[gcd(x,y)=1]\]
乱搞一下,改成枚举因子
\[ans=\sum_{i=1}^N\sum_{j=1}^M\frac{N}{i}\frac{M}{j}[gcd(i,j)=1]\]
显然,来一发莫比乌斯反演
\[f(x)=\sum_{i=1}^N\sum_{j=1}^M\frac{N}{i}\frac{M}{j}[gcd(i,j)=x]\]
所以\(ans=f(1)\)
\[g(x)=\sum_{x|d}f(x)\]
\[g(x)=\sum_{x|d}\sum_{i=1}^N\sum_{j=1}^M\frac{N}{i}\frac{M}{j}[gcd(i,j)=d]\]
\[g(x)=\sum_{i=1}^N\sum_{j=1}^M\frac{N}{i}\frac{M}{j}[gcd(i,j) \% x=0]\]
\(x\)提出来我们就可以排除\(gcd\)的影响
\[g(x)=\sum_{i=1}^{\frac{N}{x}}\sum_{j=1}^{\frac{M}{x}}\frac{N}{ix}\frac{M}{jx}[gcd(i,j) \% 1=0]\]
\[g(x)=\sum_{i=1}^{\frac{N}{x}}\sum_{j=1}^{\frac{M}{x}}\frac{N}{ix}\frac{M}{jx}\]
根据莫比乌斯反演定理
\[f(x)=\sum_{x|d}μ(\frac{d}{x})g(d)\]
\[f(x)=\sum_{x|d}μ(\frac{d}{x})\sum_{i=1}^{\frac{N}{d}}\sum_{j=1}^{\frac{M}{d}}\frac{N}{id}\frac{M}{jd}\]
\(ans=f(1)\)所以
\[ans=\sum_{d=1}^Nμ(d)\sum_{i=1}^{\frac{N}{d}}\sum_{j=1}^{\frac{M}{d}}\frac{N}{id}\frac{M}{jd}\]
\[ans=\sum_{d=1}^Nμ(d)\sum_{i=1}^{\frac{N}{d}}\frac{N}{id}\sum_{j=1}^{\frac{M}{d}}\frac{M}{jd}\]
先用数论分块\(O(n\sqrt n)\)预处理一个\[sum(x)=\sum_{i=1}^x\frac{x}{i}\]
于是\[ans=\sum_{d=1}^Nμ(d)sum(\frac{N}{d})sum(\frac{M}{d})\]
显然我们可以把前面一部分预处理前缀和,后面数论分块加上前面的预处理可以\(O(\sqrt n )的算出每一次的答案\)

完整代码

#include
#define ll long longusing namespace std;const int N=1e6,MAX=50000;int prime[N],isprime[N],miu[N],cnt,sum[N];void pre(){ miu[1]=1; for(int i=2;i<=MAX;++i){ if(!isprime[i])miu[i]=-1,prime[++cnt]=i; for(int j=1;j<=cnt&&i*prime[j]<=MAX;++j){ isprime[i*prime[j]]=1; if(i%prime[j]==0)break; miu[i*prime[j]]=-miu[i]; } } for(int i=1;i<=MAX;++i)miu[i]+=miu[i-1]; for(int i=1;i<=MAX;++i){ for(int l=1,r;l<=i;l=r+1){ r=i/(i/l); r=min(r,i); sum[i]+=(r-l+1)*(i/l); } }}int main(){ int T=0; cin>>T; pre(); while(T--){ int n,m; ll ans=0; cin>>n>>m; if(n>m)swap(n,m); for(int l=1,r;l<=n;l=r+1){ r=min(n/(n/l),m/(m/l)); ans+=1ll*(miu[r]-miu[l-1])*sum[n/l]*sum[m/l]; } printf("%lld\n",ans); } return 0; }

转载于:https://www.cnblogs.com/ljq-despair/p/8683769.html

你可能感兴趣的文章
Hash表
查看>>
通过CLR API实现C++调用C#代码交互
查看>>
织梦添加模块之占位
查看>>
管理之道(十二) - 让员工随时看到工作成果
查看>>
转 python selenium 常见问题列表
查看>>
Html5 の 微信飞机大战
查看>>
实现winform DataGridView控件判断滚动条是否滚动到当前已加载的数据行底部
查看>>
maven安装及maven项目导入流程
查看>>
iOS版本的Google Earth发布了5个3D城市图形
查看>>
属性页面Flexbox布局的简单演示之二
查看>>
如何在Windows上配置EBS R12.1.3的OAF开发环境
查看>>
WPF 如何加载图片
查看>>
openldap---ldapsearch使用
查看>>
Leetcode: Palindrome Partitioning II
查看>>
Eclipse安装SVN插件
查看>>
ubuntu12.04管理员账户登录不了桌面,仅仅能客人会话登录
查看>>
多媒体开发之rtsp---rtsp client 端的实现
查看>>
poj 1147 Binary codes
查看>>
C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 防止暴力破解密码、提高大型信息系统安全...
查看>>
java.lang.NoClassDefFoundError: ch/qos/logback/core/joran/spi/JoranException
查看>>