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 ...
随机推荐
- Redis记录-redis和memcached的区别
1.Redis和Memcache都是将数据存放在内存中,都是内存数据库.不过memcache还可用于缓存其他东西,例如图片.视频等等: 2.Redis不仅仅支持简单的k/v类型的数据,同时还提供lis ...
- 贪心算法: Codevs 1052 地鼠游戏
#include <iostream> #include <algorithm> #include <queue> #include <cstring> ...
- 流媒体技术学习笔记之(十二)Linux(Ubuntu)环境运行EasyDarwin
Debug问题??? ./easydarwin -c ./easydarwin.xml & //这样的话是80端口 ./easydarwin -c ./easydarwin.xml -d // ...
- 单字节编码&双字节编码
单字节编码(WINDOWS-1252.ISO-8859-1.UTF-8) 双字节编码(UTF-16) Windows 记事本默认会将文件保存为单字节的 ANSI(ASCII).如果您选择 " ...
- CSS规范 - 优化方案--(来自网易)
值缩写 缩写值可以减少CSS文件大小,并增加可读性和可维护性. 但并非所有的值都必须缩写,因为当一个属性的值缩写时,总是会将所有项都设置一遍,而有时候我们不希望设置值里的某些项. /* 比如我们用下面 ...
- javascript公有静态成员
公共静态成员在javascript中并没有特殊语法来表示静态成员.但是可以通过使用构造函数向其添加属性这种方式. //构造函数 var Gadget = function(){}; //静态方法 Ga ...
- Javascript Jquery 中的数组定义与操作
1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多维数组,但是因为数组里面可以包含对象(数组也是一个对象),所以数组可以通过相互嵌套实现类似多维数 ...
- 两个不能同时共存的条件orWhere查询
举例: //我的所有的积分记录 1,我分享的:2,我点击的:(两个条件不能共存) $activity_log = ActivitySharedLog::where(function ($query) ...
- django错误笔记——1242 Subquery returns more than 1 row
在数据库查询操作过程中,子查询结果不唯一,导致外面的查询无法进行. 我的错误语句: rid = models.User.objects.filter(username=username).values ...
- tf.range()函数
range()函数用于创建数字序列变量,有以下两种形式: range(limit, delta=1, dtype=None, name='range') range(start, limit, del ...