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 ...
随机推荐
- SQL记录-Linux CentOS配置ORACLE 12c
1.准备LIINX软件包 操作系统:centos7 虚拟机:VMware 12 JDK:1.8 数据库:oracle 12c 2.配置基础环境 2.1 部署虚拟机VM(过程略) 2.2 部署操作系统C ...
- JeeSite 4.x 树形结构的表设计和用法
有些同仁对于 JeeSite 4 中的树表设计不太了解,本应简单的方法就可实现,却写了很多复杂的语句和代码,所以有了这篇文章. 在 JeeSite 4 中的树表设计我还是相对满意的,这种设计比较容易理 ...
- HTML的文档类型:<!DOCTYPE >
<!DOCTYPE> 声明:它不是 HTML 标签而且对大小写不敏感,而是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令.而且 声明必须是 HTML 文档的第一行,位于 ...
- Javascript - Vue - vue对象的生命周期
vue对象的生命周期 从vue的创建到销毁会经过一系列的事件,这是vue对象的生命周期. 创建期间的生命周期函数 <div id="box"> <h3 id ...
- 浅介HTML DOM
什么是DOM? DOM是Document Object Model(文档对象模型)的缩写. DOM是W3C(万维网联盟)的标准. DOM定义了访问HTML和XML文档的标准: “W3C文档对象模型(D ...
- Python学习二|Python的一些疑问
最近写了一点Python代码,作为一个java程序员,面对Python这么便捷的语言不禁有点激动.不过呢,有时候也会遇到一些无法理解的东西. 例如: er = [[1,2,3], [4,5,6], [ ...
- JPA 菜鸟教程 15 继承-一个表-SINGLE_TABLE
原地址:http://blog.csdn.net/JE_GE/article/details/53678422 继承映射策略 一个类继承结构一个表的策略,最终只生成一个表,这是继承映射的默认策略. 举 ...
- FileInputStram入门
1.read() 读取一个字节 @Test public void test1() throws Exception{ //1.指定文件读取路径 String filePath = "E ...
- C++Primer #7 类
类的定义 简单的来说类就是数据和它的操作的一种封装,内部提供接口函数 类的成员函数的声明必须在类的内部,而它的定义则既可以放在类的内部也可以放在类的外部.(一般在类内进行声明,类外实现函数定义) 定义 ...
- Java中的String问题
方式一:String a = “aaa” ; 方式二:String b = new String(“aaa”); 两种方式都能创建字符串对象,但方式一要比方式二更优.因为字符串是保存在常量池中的,而通 ...