[BZOJ2440]完全平方数解题报告|莫比乌斯函数的应用
完全平方数
小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而这丝毫不影响他对其他数的热爱。
这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一个小X讨厌的数。他列出了所有小X不讨厌的数,然后选取了第 K个数送给了小X。小X很开心地收下了。
然而现在小 W 却记不起送给小X的是哪个数了。你能帮他一下吗?
还记得第一次接触这道题是一年前吧..那时候参加了一场某OJ的比赛
然后并不会做..在discuss里面发现是“BZOJ2440原题”
然后看到了一个叫做莫比乌斯函数的东西...很努力地看但是仍然没看懂...
也奇怪..现在就能看懂了呢...
莫比乌斯函数:
μ(1)=1;
对于每个质因子的次数都为1的数n,假设其能拆分出k个质因子,μ(n)=(-1)^k
其他情况下μ(n)=0
构造方法:
首先容易证明莫比乌斯函数是积性函数
然后用线筛
procedure build;
var m:int64;
i,j:longint;
begin
fillchar(vis,sizeof(vis),true);
prime[]:=;
m:=trunc(sqrt(INF));mu[]:=;
for i:= to m do
begin
if vis[i] then
begin
inc(prime[]);
prime[prime[]]:=i;
mu[i]:=-;
end;
for j:= to prime[] do
begin
if i*prime[j]>m then break;
vis[i*prime[j]]:=false;
if i mod prime[j]= then
begin
mu[prime[j]*i]:=;
break;
end;
mu[prime[j]*i]:=-mu[i];
end;
end;
end;
对于这道题,很容易想到二分答案+容斥
然后发现由偶数个次数为一的质数乘起来的完全平方因子,对答案的贡献是正的,奇数个是负的
这个就可以用莫比乌斯函数来替代
program bzoj2440;
const INF = ;maxn = ;
var test,L,R,ans,k,mid:int64;
tt:longint;
prime,mu:array[-..maxn]of int64;
vis:array[-..maxn]of boolean; procedure build;
var m:int64;
i,j:longint;
begin
fillchar(vis,sizeof(vis),true);
prime[]:=;
m:=trunc(sqrt(INF));mu[]:=;
for i:= to m do
begin
if vis[i] then
begin
inc(prime[]);
prime[prime[]]:=i;
mu[i]:=-;
end;
for j:= to prime[] do
begin
if i*prime[j]>m then break;
vis[i*prime[j]]:=false;
if i mod prime[j]= then
begin
mu[prime[j]*i]:=;
break;
end;
mu[prime[j]*i]:=-mu[i];
end;
end;
end; function solve(x:int64):int64;
var sum:int64;
i:longint;
begin
sum:=;
for i:= to trunc(sqrt(x)) do
inc(sum,(x div (int64(i)*i))*mu[i]); exit(sum);
end; begin
assign(input,'bzoj2440.in');reset(input);
readln(test);
build;
for tt:= to test do
begin
readln(k);
L:=;R:=INF;ans:=-;
while L<=R do
begin
mid:=(L+R) >> ;
if solve(mid)>=k then
begin
ans:=mid;R:=mid-;
end else L:=mid+;
end;
writeln(ans);
end;
end.
[BZOJ2440]完全平方数解题报告|莫比乌斯函数的应用的更多相关文章
- BZOJ2440 中山市选2011完全平方数(容斥原理+莫比乌斯函数)
如果能够知道不大于n的合法数有多少个,显然就可以二分答案了. 考虑怎么求这个.容易想到容斥,即枚举完全平方数.我们知道莫比乌斯函数就是此种容斥系数.筛出来就可以了. 注意二分时会爆int. #incl ...
- 完全平方数 HYSBZ - 2440 (莫比乌斯函数容斥)
完全平方数 HYSBZ - 2440 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他 ...
- [BZOJ 2440] [中山市选2011] 完全平方数 【二分 + 莫比乌斯函数】
题目链接:BZOJ - 2440 题目分析 首先,通过打表之类的方法可以知道,答案不会超过 2 * k . 那么我们使用二分,对于一个二分的值 x ,求出 [1, x] 之间的可以送出的数有多少个. ...
- [luogu P2586] GCD 解题报告 (莫比乌斯反演|欧拉函数)
题目链接:https://www.luogu.org/problemnew/show/P2568#sub 题目大意: 计算$\sum_{x=1}^n\sum_{y=1}^n [gcd(x,y)==p ...
- BZOJ2440: [中山市选2011]完全平方数 容斥原理_莫比乌斯函数
emmm....... 数学题都不友好QAQ...... Code: #include <cstdio> #include <algorithm> #include <c ...
- [计蒜客] tsy's number 解题报告 (莫比乌斯反演+数论分块)
interlinkage: https://nanti.jisuanke.com/t/38226 description: solution: 显然$\frac{\phi(j^2)}{\phi(j)} ...
- [jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)
题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 注: ...
- BZOJ2440(容斥+莫比乌斯函数)
题目本质: 首先有如下结论: 而通过写一写可以发现: 举例来讲,36及其倍数的数,会被1的倍数加一遍,被4的倍数扣一遍,会被9的倍数扣一遍,而为了最终计数为0,需要再加回来一遍,所以在容斥里面是正号. ...
- 【BZOJ2440】完全平方数 [莫比乌斯函数]
完全平方数 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 小X自幼就很喜欢数. 但奇怪的是 ...
随机推荐
- oracle数据库之PL/SQL 块结构和组成元素
一.PL/SQL 块 (一)PL/SQL 程序由三个块组成,即声明部分.执行部分.异常处理部分 PL/SQL 块的结构如下: 1.DECLARE /* 声明部分: 在此声明 PL/SQL 用到的变量, ...
- node必学的Hello World实现--服务器实现
node是JavaScript运行在后端的一种实现.而后端语言,不管是php,java都需要一个服务器才能跑起来,node如是. node的服务器较php而言,少了单独安装服务器的步骤,node的服务 ...
- 原生js移动端字体自适应方案
自从进入新公司之后,就一直采用800的方案,也就是判断屏幕尺寸,大于800px是一种html字体处理方案,另一种方案是小于800px的html字体处理方案, 代码如下: (function(doc, ...
- mysql的my.cnf配置文件
[client]port = 3306default-character-set=utf8mb4socket = /var/run/mysqld/mysql.sock# user=david# pas ...
- java 基础--switch--003
1,break可以省略吗? default中的可以省略,其他的如果省略会执行下一个case,从下一个case的 break中中断.(case穿透) 2,default一定要在最后吗? 不是,可以在任意 ...
- ipython matplotlib
matplotlib实际上是一套面向对象的绘图库,它所绘制的图表中的每个绘图元素,例如线条Line2D.文字Text.刻度等在内存中都有一个对象与之对应.为了方便快速绘图matplotlib通过pyp ...
- Qt快速入门学习笔记(画图篇)
1.Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.其中QPainter用来执行 ...
- Go语言【第七篇】:Go函数
Go语言函数 函数是基本的代码块,用于执行某个任务.Go语言最少有个main()函数,可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务.函数声明告诉了编译器函数的名称,返回类型和参数.Go ...
- poj 1273 && hdu 1532 Drainage Ditches (网络最大流)
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 53640 Accepted: 2044 ...
- CF995C Leaving the Bar
题目描述 For a vector v⃗=(x,y) \vec{v} = (x, y) v=(x,y) , define ∣v∣=x2+y2 |v| = \sqrt{x^2 + y^2} ∣v∣=x2 ...