BZOJ2671 : Calc
设$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)$。
#include<cstdio>
typedef long long ll;
const int N=46500,M=505030;
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;
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
int main(){
for(scanf("%d",&n);(ll)lim*(lim+1)<=n;lim++);
for(mu[1]=1,i=2;i<lim;i++){
if(!vis[i])p[tot++]=i,mu[i]=-1;
for(j=0;j<tot;j++){
if(i*p[j]>=lim)break;
vis[i*p[j]]=1;
if(i%p[j])mu[i*p[j]]=-mu[i];else break;
}
}
for(i=1;i<lim;i++)if(mu[i])for(j=i;j<lim;j+=i)add(j,i);
for(i=2;i<lim;i++)for(m=n/i,j=g[i];j;j=nxt[j]){
for(t=0,d=v[j],l=1;l<i&&i+l<=m;l=r+1){
r=m/(m/(i+l))-i;
if(r>=i)r=i-1;
t+=(ll)(r/d-(l-1)/d)*(m/(i+l));
}
ans+=t*mu[d];
}
return printf("%lld",ans),0;
}
BZOJ2671 : Calc的更多相关文章
- BZOJ2671 Calc 【莫比乌斯反演】
题目链接 BZOJ2671 题解 令\(d = (a,b)\),\(a = dx,b = dy\) 那么有 \[ \begin{aligned} d(x + y) | d^2xy \\ (x + y) ...
- BZOJ2671 Calc(莫比乌斯反演)
两个多月之前写的题,今天因为看到一道非常相似的题就翻出来了,发现完全不会,没救. 感觉这个题其实第一步是最难想到的,也是最重要的. 设d=gcd(a,b).那么a=yd,b=xd,且gcd(x,y)= ...
- 【BZOJ2671】Calc(莫比乌斯反演)
[BZOJ2671]Calc 题面 BZOJ 给出N,统计满足下面条件的数对(a,b)的个数: 1.\(1\le a\lt b\le N\) 2.\(a+b\)整除\(a*b\) 我竟然粘了题面!!! ...
- 【BZOJ2671】Calc 数学
[BZOJ2671]Calc Description 给出N,统计满足下面条件的数对(a,b)的个数: 1.1<=a<b<=N 2.a+b整除a*b Input 一行一个数N Out ...
- BZOJ2506: calc
Description 给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值 ...
- css绘制特殊图形,meida查询,display inline-box间隙问题以及calc()函数
本文同时发表于本人个人网站 www.yaoxiaowen.com 距离上一篇文章已经一个月了,相比于写代码,发现写文章的确是更需要坚持的事情.言归正传,梳理一下这一个月来,在写ife任务时,有必要记录 ...
- 利用calc计算宽度
width:calc(100% - 40px)可用 + - * / 进行计算(ie9+) 注:计算符号前后必须跟上空格.
- CSS3的calc()使用
CSS3的calc()使用 calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度.比如说,你可以使用calc()给元素的border.margin.pad ...
- 理解CSS中的数学表达式calc()
前面的话 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路.本文将介绍calc()的相关内容 定义 数学表达式calc()是calculat ...
随机推荐
- SHELL (4) —— 变量的数值计算实践
摘自:Oldboy Linux运维——SHELL编程实战 利用(())双括号进行比较及判断: [root@yeebian ~]# echo $((3<8)) 1 #1表示真. [root@yee ...
- SQL语句(九)使用特殊关系运算符查询
使用特殊关系运算符查询 特殊关系运算符 IN.NOT IN IS NULL.IS NOT NULL BETWEEN.NOT BETWEEN LIKE.NOT LIKE IN , NOT IN IN 在 ...
- MySql数据库表的查询操作
http://www.cnblogs.com/whgk/p/6149009.html 优化:http://www.ihref.com/read-16422.html MYSQL常用的几种连接查询方法
- js调试系列: 调试基础与技巧
js调试系列目录: - 昨天我们见识到了断点的强悍,在断点的配合下进行动态调试,让读代码变的轻松不少,特别是ajax之类的.在昨天的课后练习中,确实增加了不少难度,因为 提交评论 按钮是用 jQuer ...
- javascript有关this的那些事(某渣提出的问题)
某人提出 请教下谁能解释下这个值var name = "The Window"; var object = { name: "My O ...
- [原]Android 初遇Http错误 httpClient.execute
错误源头: HttpResponse response = httpClient.execute(httpget); 错误信息: android.os.NetworkOnMainThreadExcep ...
- C# 常用控件属性及方法介绍
C#常用控件属性及方法介绍 目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox ...
- sublime text 3 开启卡顿(win7)解决办法
启动sublime3,ctrl+~打开命令窗口,输入以下 { "update<em>check": false, "font</em>size&q ...
- mybatis入门程序-(二)
1. 添加配置文件 log4j.properties # Global logging configuration #开发环境下日志级别设置成DEBUG,生产环境设置成info或者error log4 ...
- git merge branch to master
git checkout master git pull git merge testbranch git push