设$d=\gcd(a,b),a=xd,b=yd$,则$a+b|ab$等价于$x+y|xyd$。

因为$x,y$互质,所以$x+y|d$。

假设$x<y$,那么对于固定的$x,y$,有$\lfloor\frac{n}{y(x+y)}\rfloor$个$d$。

枚举$y$,设$m=\lfloor\frac{n}{y}\rfloor$,则它的贡献为:

\[\begin{eqnarray*}
&&\sum_{i=1}^{y-1}[\gcd(i,y)=1]\lfloor\frac{m}{i+y}\rfloor\\
&=&\sum_{i=1}^{y-1}\sum_{d|\gcd(i,y)}\mu(d)\lfloor\frac{m}{i+y}\rfloor\\
&=&\sum_{i=1}^{y-1}\sum_{d|i,d|y}\mu(d)\lfloor\frac{m}{i+y}\rfloor\\
&=&\sum_{d|y}\mu(d)\sum_{d|i}\lfloor\frac{m}{i+y}\rfloor
\end{eqnarray*}\]

枚举$y$的约数$d$,再分段计算$\sum_{d|i}\lfloor\frac{m}{i+y}\rfloor$即可。

时间复杂度$O(N^\frac{3}{4}\log N)$。

  1. #include<cstdio>
  2. typedef long long ll;
  3. const int N=46500,M=505030;
  4. int n,m,lim,i,j,d,l,r,vis[N],tot,p[N],mu[N],g[N],v[M],nxt[M],ed;ll ans,t;
  5. inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
  6. int main(){
  7. for(scanf("%d",&n);(ll)lim*(lim+1)<=n;lim++);
  8. for(mu[1]=1,i=2;i<lim;i++){
  9. if(!vis[i])p[tot++]=i,mu[i]=-1;
  10. for(j=0;j<tot;j++){
  11. if(i*p[j]>=lim)break;
  12. vis[i*p[j]]=1;
  13. if(i%p[j])mu[i*p[j]]=-mu[i];else break;
  14. }
  15. }
  16. for(i=1;i<lim;i++)if(mu[i])for(j=i;j<lim;j+=i)add(j,i);
  17. for(i=2;i<lim;i++)for(m=n/i,j=g[i];j;j=nxt[j]){
  18. for(t=0,d=v[j],l=1;l<i&&i+l<=m;l=r+1){
  19. r=m/(m/(i+l))-i;
  20. if(r>=i)r=i-1;
  21. t+=(ll)(r/d-(l-1)/d)*(m/(i+l));
  22. }
  23. ans+=t*mu[d];
  24. }
  25. return printf("%lld",ans),0;
  26. }

  

BZOJ2671 : Calc的更多相关文章

  1. BZOJ2671 Calc 【莫比乌斯反演】

    题目链接 BZOJ2671 题解 令\(d = (a,b)\),\(a = dx,b = dy\) 那么有 \[ \begin{aligned} d(x + y) | d^2xy \\ (x + y) ...

  2. BZOJ2671 Calc(莫比乌斯反演)

    两个多月之前写的题,今天因为看到一道非常相似的题就翻出来了,发现完全不会,没救. 感觉这个题其实第一步是最难想到的,也是最重要的. 设d=gcd(a,b).那么a=yd,b=xd,且gcd(x,y)= ...

  3. 【BZOJ2671】Calc(莫比乌斯反演)

    [BZOJ2671]Calc 题面 BZOJ 给出N,统计满足下面条件的数对(a,b)的个数: 1.\(1\le a\lt b\le N\) 2.\(a+b\)整除\(a*b\) 我竟然粘了题面!!! ...

  4. 【BZOJ2671】Calc 数学

    [BZOJ2671]Calc Description 给出N,统计满足下面条件的数对(a,b)的个数: 1.1<=a<b<=N 2.a+b整除a*b Input 一行一个数N Out ...

  5. BZOJ2506: calc

    Description            给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值 ...

  6. css绘制特殊图形,meida查询,display inline-box间隙问题以及calc()函数

    本文同时发表于本人个人网站 www.yaoxiaowen.com 距离上一篇文章已经一个月了,相比于写代码,发现写文章的确是更需要坚持的事情.言归正传,梳理一下这一个月来,在写ife任务时,有必要记录 ...

  7. 利用calc计算宽度

    width:calc(100% - 40px)可用 + - * / 进行计算(ie9+) 注:计算符号前后必须跟上空格.

  8. CSS3的calc()使用

    CSS3的calc()使用 calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度.比如说,你可以使用calc()给元素的border.margin.pad ...

  9. 理解CSS中的数学表达式calc()

    前面的话 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路.本文将介绍calc()的相关内容 定义 数学表达式calc()是calculat ...

随机推荐

  1. poj 2947 Widget Factory (高斯消元解同余方程组+判断无解、多解)

    http://poj.org/problem?id=2947 血泪史: CE:poj的string类型要加string库,swap不能直接交换数组 WA: x[m-1]也有可能<3啊O(≧口≦) ...

  2. WebSockets Tutorial(教程一)WebSockets简介

    一.WebSockets简介 以字面意思来说,握手可以被定义为两个人抓住和握手右手,象征着问候,祝贺,同意或告别.在计算机科学中,握手是确保服务器与客户端同步的过程.握手是Web Socket协议的基 ...

  3. 流媒体技术学习笔记之(九)减少VLC 延迟的方法

    之前写过一篇关于在Linux平台上编译Android平台上VLC播放器源代码的文章,vlc这款播放器非常优秀而且是开源的,它的核心是开源视频编解码库ffmpeg.而且这款播放器还支持RTSP协议,这个 ...

  4. [python]python三元表达式另类实现方式

    () variable = a if exper else b ()variable = (exper and [b] or [c])[] () variable = exper and b or c

  5. Javascript中与Scroll有关的方法

    这块确实太乱了,被兼容搞的简直快要晕死,默默地总结下... 与scroll相关的方法 4个window对象下:scrollX.scrollY.scrollTo.scroll(作用和scrollTo一样 ...

  6. 20155206 2016-2017-2 《Java程序设计》第6周学习总结

    20155206 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 串流设计 流(Stream)是对「输入输出」的抽象,注意「输入输出」是相对程序而言的. Ja ...

  7. DDLog设置方法

          CHENYILONG Blog DDLog设置方法 本文永久地址为http://www.cnblogs.com/ChenYilong/p/3984246.html,转载请注明出处. 201 ...

  8. tf.range()函数

    range()函数用于创建数字序列变量,有以下两种形式: range(limit, delta=1, dtype=None, name='range') range(start, limit, del ...

  9. 使用Docx4j创建word文档

    原文标题:Creating Word documents with Docx4j 原文链接:http://blog.iprofs.nl/2012/09/06/creating-word-documen ...

  10. bootstrap 引用注意事项

    2014年6月8日 13:35:31 bootstrap 提供了cdn服务,在引用css,js的时候注意先后顺序,firebug就不会报错 <script src="http://cd ...