BZOJ2671 Calc(莫比乌斯反演)
两个多月之前写的题,今天因为看到一道非常相似的题就翻出来了,发现完全不会,没救。
感觉这个题其实第一步是最难想到的,也是最重要的。
设d=gcd(a,b)。那么a=yd,b=xd,且gcd(x,y)=1。a+b|ab等价于x+y|xyd。
由gcd(x,y)=1,得gcd(x+y,y)=gcd(x,x+y)=1。x和y都与x+y互质,那么他们的积xy也与x+y互质,即gcd(xy,x+y)=1。
gcd(xy,x+y)=1,而x+y|xyd,所以x+y|d。
那么现在要求的是
下取整的那部分是满足x+y|d且xd<=n的d的个数。
显然x>√n之后就没有贡献了。这样复杂度变为线性(不算gcd复杂度的话),但还不够。
看到那个gcd=1,妥妥的上莫比乌斯反演。接下来比较套路。



后面一部分的计算可以整除分块。
那这样的时间复杂度是多少呢?看起来是低于线性的,但具体是多少我也不知道……总之他跑的比香港记者还非常快。
今天看到的那道题多了一个限制,即ab/(a+b)与gcd(a,b)互质。
设c=ab/(a+b),那么有(x+y)c=xyd。设d=k(x+y),c=kxy。由gcd(d,c)=1,如果能证明k是正整数的话,那么显然k=1。下证k为正整数。
反证。假设k=u/v(u,v∈N*,gcd(u,v)=1,v>1)。因为c,d均为正整数,所以v|x+y,v|xy。而又有gcd(x+y,xy)=1,矛盾。所以k为正整数。
剩下部分就类似了,由于确定了k=1即d=x+y,可以做到严格的√nlogn。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 100000
#define min(a,b) ((a)<(b)?(a):(b))
#define ri register int
int n,m,mobius[N],prime[N],cnt=;
long long ans=;
bool flag[N];
int main()
{
cin>>n;
m=sqrt(n);
flag[]=;mobius[]=;
for (int i=;i<=m;i++)
{
if (!flag[i]) prime[++cnt]=i,mobius[i]=-;
for (int j=;j<=cnt&&prime[j]*i<=m;j++)
{
flag[prime[j]*i]=;
if (i%prime[j]==) break;
else mobius[prime[j]*i]=-mobius[i];
}
}
for (ri i=;i<=m;i++)
if (mobius[i])
{
ri v=i*i,c=m/i+;
for (ri k=;k<c;k++)
{
ri t=n/(k*v),u=(k<<)-,h=min(t,u)+;
for (ri j=k+;j<h;)
{
ri w=t/j,l=min(u,t/w)+;
ans+=1ll*(l-j)*mobius[i]*w;
j=l;
}
}
}
cout<<ans;
}
BZOJ2671 Calc(莫比乌斯反演)的更多相关文章
- 【BZOJ2671】Calc(莫比乌斯反演)
[BZOJ2671]Calc 题面 BZOJ 给出N,统计满足下面条件的数对(a,b)的个数: 1.\(1\le a\lt b\le N\) 2.\(a+b\)整除\(a*b\) 我竟然粘了题面!!! ...
- hdu.5212.Code(莫比乌斯反演 && 埃氏筛)
Code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- bzoj 2818 Gcd(欧拉函数 | 莫比乌斯反演)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2818 [题意] 问(x,y)为质数的有序点对的数目. [思路一] 定义f[i]表示i之 ...
- 【BZOJ2301】【HAOI2011】Problem B(莫比乌斯反演)
[BZOJ2301][HAOI2011]Problem B(莫比乌斯反演) 题面 Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y ...
- 【Luogu3455】【POI2007】ZAP-Queries(莫比乌斯反演)
[Luogu3455][POI2007]ZAP-Queries(莫比乌斯反演) 题面 题目描述 FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x ...
- BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演
BZOJ_3994_[SDOI2015]约数个数和_莫比乌斯反演 Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表 ...
- Luogu4916 魔力环 莫比乌斯反演、组合、生成函数
传送门 先不考虑循环同构的限制,那么对于一个满足条件的序列,如果它的循环节长度为\(d\),那么与它同构的环在答案中就会贡献\(d\)次. 所以如果设\(f_i\)表示循环节长度恰好为\(i\)的满足 ...
- LOJ# 572. 「LibreOJ Round #11」Misaka Network 与求和(min25筛,杜教筛,莫比乌斯反演)
题意 求 \[ \sum_{i = 1}^{n} \sum_{i = 1}^{n} f(\gcd(i, j))^k \pmod {2^{32}} \] 其中 \(f(x)\) 为 \(x\) 的次大质 ...
- 【LOJ#572】Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛)
[LOJ#572]Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛) 题面 LOJ \[ans=\sum_{i=1}^n\sum_{j=1}^n f(gcd(i,j))^k\ ...
随机推荐
- 学习CSS布局 - margin: auto;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C语言中getch()、getche()和getchar()
本文章为转载文章,文档贡献者wdzhangxiang 个人网址:www.baidu.com/p/wdzhangxiang 首先不要忘了,要用getch()必须引入头文件conio.h,以前学C语言的时 ...
- 从github checkout子文件夹
1.将远程项目加载到指定目录:$git init; $git remote add -f origin url2.使用SparseCheckout模式:$git config core.sparsec ...
- Luogu P1896 [SCOI2005]互不侵犯
一道超级简单的状压DP题所以说状压是个好东西 看数据范围,同时我们发现一个格子要么放国王or不放,因此可以用二进制数来表示某一行的国王放置信息 于是我们马上想到用\(f_{i,j}\)表示放了前\(i ...
- [Spark][Python][DataFrame][SQL]Spark对DataFrame直接执行SQL处理的例子
[Spark][Python][DataFrame][SQL]Spark对DataFrame直接执行SQL处理的例子 $cat people.json {"name":" ...
- 详解javascript中this的工作原理
在 JavaScript 中 this 常常指向方法调用的对象,但有些时候并不是这样的,本文将详细解读在不同的情况下 this 的指向. 一.指向 window: 在全局中使用 this,它将会指向全 ...
- 【下一代核心技术DevOps】:(六)Rancher集中存储及相关应用
1. 前言 为什么要使用集中存储? 使用集中存储有个很大的优势是数据安全和统一管理,和集群完美配合. 产品集成存储经历过几个阶段: 1.单机本机存储. 系统使用本地硬盘存储 2.单网络集中存储. 局域 ...
- 计算机网络什么是OSI7层模型、TCP/IP4层模型理解
模型图解 应用层 就是最顶层的.通常指的应用程序初始走的协议比如有 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层 主要对数据应用层的数据包进行加密 会话层 建立.管理. ...
- OpenGL学习(1)——创建窗口
这是我的第一篇博客,试着记录学习OpenGL的过程.使用的教程:LearnOpenGL,系统:Deepin 15.9.3,IDE:Qt Creator. 添加头文件 创建窗口用到两个库:GLFW和GL ...
- Centos7系统下修改主机名操作笔记
习惯了在Centos6系统下修改主机名的操作,但是Centos7下修改主机名的操作却大不相同!操作笔记如下: 在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient) ...