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

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

前置芝士

关于这个题,你必须知道一个这样奇奇怪怪的式子啊QAQ

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

留坑,先感性理解:后面那个gcd是为了去重。

UPD:

5c7fb12fd9952.png
--------

正文

根据前一部分,我们所要推倒的式子就变成了

\[ans=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{x|i}\sum_{y|j}\left [ gcd(x,y)=1 \right ]\]

我们可以改变一下枚举顺序,原来是枚举原数,现在我们改为枚举约数,再利用数学性质将其倍数全部筛掉,式子即变成

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

于是,我们可以把里面的那个东西稍稍的替换一下

\[ans=\sum_{i=1}^{n}\sum_{j=1}^{m}\left \lfloor \frac{n}{i} \right \rfloor\left \lfloor \frac{m}{j} \right \rfloor\sum_{d|gcd(i,j)}\mu (d)\]

根据莫比乌斯函数的性质,这两个东西显然是等价的。

然后我们可以在和式枚举时就将gcd消掉,同时将d调整到和式最外层

然后整个式子就变成

\[ans=\sum_{d=1}^{min(n,m)}\mu (d)\sum_{x=1}^{\left \lfloor \frac{n}{x} \right \rfloor}\left \lfloor \frac{n}{dx} \right \rfloor\sum_{y=1}^{\left \lfloor \frac{m}{y} \right \rfloor}\left \lfloor \frac{m}{dy} \right \rfloor\]

唯一的难点是,$\sum_{x=1}^{\left \lfloor \frac{n}{x} \right \rfloor}\left \lfloor \frac{n}{dx} \right \rfloor $

\(n/x\),换成一个变量,就会发现,这东西也是可以分块的!!!

然后就可以愉快的整除分块了

贴代码

#include
#include
#include
using namespace std;typedef long long ll;const int maxn=5e4+10;int miu[maxn],prime[maxn],t;bool vis[maxn];ll g[maxn];void get_g(){ for(int i=1;i<=maxn;++i) { int l,r; for(l=1;l<=i;l=r+1) { r=i/(i/l); g[i]+=(i/l)*(r-l+1); } }}//同样分块处理 void mobius(){ miu[1]=1; for(int i=2;i<=maxn;i++) { if(vis[i]==0) miu[i]=-1,++t,prime[t]=i; for(int j=1;j<=t&&i*prime[j]<=maxn;++j) { vis[i*prime[j]]=1; if(!(i%prime[j])) break; else miu[i*prime[j]]-=miu[i]; } } for(int i=1;i<=maxn;++i) miu[i]+=miu[i-1];}int main(){ get_g(); mobius(); int t; int n,m; scanf("%d",&t); for(int _=1;_<=t;++_) { ll ans=0; scanf("%d%d",&n,&m); int tmp=min(n,m); long long l,r; for(l=1;l<=tmp;l=r+1) { r=min(n/(n/l),m/(m/l)); ans+=(miu[r]-miu[l-1])*g[n/l]*g[m/l]; } printf("%lld\n",ans); }}

转载于:https://www.cnblogs.com/HenryHuang-Never-Settle/p/10484930.html

你可能感兴趣的文章
【PLSQL】package包的使用
查看>>
可持久化数据结构
查看>>
solr 4.4添加索引是新手容易遇到的问题
查看>>
JavaScript的跨域共享的方法
查看>>
(网页)jQuery的时间datetime控件在AngularJs中使用实例
查看>>
利用Android-FingerprintManager类实现指纹识别
查看>>
flask---注册-验证简单逻辑api接口
查看>>
[Python] Create a minimal website in Python using the Flask Microframework
查看>>
【PHP 】 伪静态 - 3. 伪静态的基本使用
查看>>
LA 4636 (贪心) Cubist Artwok
查看>>
项目经理怎样获得领导和客户的认可
查看>>
多线程优化 锁升级
查看>>
Linux文件系统
查看>>
安卓APP测试验证点总结
查看>>
idea启动崩溃问题
查看>>
python3 异常处理
查看>>
hdu2102(广搜)
查看>>
java.security.NoSuchAlgorithmException: SHA1PRNG SecureRandom not available
查看>>
[SinGuLaRiTy] 2017 百度之星程序设计大赛 复赛
查看>>
hard-negative mining 及伪代码实现
查看>>