题意

\(T\)组数据,每次询问第\(k\)个无平方因子的数(\(1\)不算平方因子),\(T\leq 50,k\leq 10^9\)

题解

\(k\)的范围很大,枚举肯定不行,也没什么奇妙性质,于是可以想到二分。

二分的话我们需要实现一个函数\(f(n)\)表示\(n\)以内的数中无平方因子的数个数

这十分经典,相当于求\(f(n)=\sum_{i=1}^n\mu^2(i)\)

解法就是:我们考虑一个质数\(p\),\(p^2\)的倍数都不满足要求,也就是说答案得减去\(\lfloor \frac{n}{p^2}\rfloor\)。但显然这个会重复,需要容斥。就是说一个数\(x=p_1p_2..p_k\),答案得加上\((-1)^k \lfloor \frac{n}{x^2}\rfloor\)。

然后就会神奇地发现对于一个正整数\(i\)它的贡献的系数恰好就是\(\mu(i)\)!

也就是说答案就是\(\sum_{i=1}^{\sqrt n} \mu(i) \lfloor \frac{n}{i^2}\rfloor\) 。预处理\(\mu\)前缀和然后数论分块就好。

分块那里有一点小细节,与常见数论分块不大一样。还有二分的右边界,可以设为\(k\)的\(4\)倍,实际上观察样例就可以猜到\(2\)倍就可以了。

复杂度为大致为\(O(T\sqrt k\log k)\)

#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std; typedef long long ll; const int N = 64000; int mu[N + 5], p[N + 5], cnt;
bool tag[N + 5]; void sieve(int n) {
mu[1] = 1;
for(int i = 2; i <= n; i ++) {
if(!tag[i]) {
p[cnt ++] = i;
mu[i] = -1;
}
for(int j = 0; j < cnt; j ++) {
if(i * p[j] > n) break ;
tag[i * p[j]] = 1;
if(i % p[j] == 0) {
mu[i * p[j]] = 0;
break ;
}
mu[i * p[j]] = - mu[i];
}
}
for(int i = 2; i <= n; i ++) mu[i] += mu[i - 1];
} ll calc(ll n) {
ll x = (ll) sqrt(n), ans = 0;
for(ll i = 1, j; i * i <= n; i = j + 1) {
j = sqrt(n / (n / (i * i)));
if(j > x) j = x;
ans += (mu[j] - mu[i - 1]) * (n / (i * i));
}
return ans;
} int main() {
sieve(N);
int t, k; scanf("%d", &t);
while(t --) {
scanf("%d", &k);
ll l = 1, r = 4e9, mid, ans = -1;
while(l <= r) {
mid = (l + r) >> 1;
if(calc(mid) >= k) r = (ans = mid) - 1;
else l = mid + 1;
}
printf("%lld\n", ans);
}
return 0;
}

「BZOJ 2440」完全平方数「数论分块」的更多相关文章

  1. bzoj 3834 [Poi2014]Solar Panels 数论分块

    3834: [Poi2014]Solar Panels Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 285[Submit] ...

  2. bzoj 1257 [CQOI2007]余数之和——数论分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1257 \( n\%i = n - \left \lfloor n/i \right \rfl ...

  3. BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块

    问题描述 BZOJ2301 LG2522 积性函数 若函数 \(f(x)\) 满足对于任意两个最大公约数为 \(1\) 的数 \(m,n\) ,有 \(f(mn)=f(m) \times f(n)\) ...

  4. 「BZOJ 2956」模积和

    「BZOJ 2956」模积和 令 \(l=\min(n,m)\).这个 \(i\neq j\) 非常不优雅,所以我们考虑分开计算,即: \[\begin{aligned} &\sum_{i=1 ...

  5. 「BZOJ 4228」Tibbar的后花园

    「BZOJ 4228」Tibbar的后花园 Please contact lydsy2012@163.com! 警告 解题思路 可以证明最终的图中所有点的度数都 \(< 3\) ,且不存在环长是 ...

  6. 「BZOJ 3645」小朋友与二叉树

    「BZOJ 3645」小朋友与二叉树 解题思路 令 \(G(x)\) 为关于可选大小集合的生成函数,即 \[ G(x)=\sum[i\in c ] x^i \] 令 \(F(x)\) 第 \(n\) ...

  7. 「BZOJ 4502」串

    「BZOJ 4502」串 题目描述 兔子们在玩字符串的游戏.首先,它们拿出了一个字符串集合 \(S\),然后它们定义一个字符串为"好"的,当且仅当它可以被分成非空的两段,其中每一段 ...

  8. 「BZOJ 4289」 PA2012 Tax

    「BZOJ 4289」 PA2012 Tax 题目描述 给出一个 \(N\) 个点 \(M\) 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 \(1\) 到点 \( ...

  9. 「BZOJ 2534」 L - gap字符串

    「BZOJ 2534」 L - gap字符串 题目描述 有一种形如 \(uv u\) 形式的字符串,其中 \(u\) 是非空字符串,且 \(v\) 的长度正好为 \(L\), 那么称这个字符串为 \( ...

随机推荐

  1. div 遮罩层 弹窗

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. OpenWrt添加启动脚本

    1.在 /etc/init.d 目录下建立文件 vi silabs #!/bin/sh /etc/rc.common # Copyright (C) 2006 OpenWrt.org START=93 ...

  3. Day2-VIM(二):插入

    基础 字符位置插入 i 在光标之前插入 a 在光标之后追加 你看,其实刚开始用这两个就足够了,这就是最基础的 为什么这么说呢?因为你可以依靠上一节中的移动命令来达到任意位置,然后再大力插入 不要忘了, ...

  4. EMIPLIB简介

    EMIPLIB(http://research.edm.uhasselt.be/emiplib)的全称是'EDM Media over IP libray' .EDM是Hasselt Universi ...

  5. linux下面的挂载点讲解

    linux.unix这类操作系统将系统中的一切都作为文件来管理.在windows中我们常见的硬件设备.磁盘分区等,在linux.unix中都被视作文件,对设备.分区的访问就是读写对应的文件.挂载点实际 ...

  6. Identity4 Clientcredentials 自定义客户端授权验证

    看了许多教程 ,大多数都是提前定义好客户端,但是这样有个弊端,我们并不知道以后会有多少客户端.有可能从数据库读取数据,也有可能通过json文件获取,总之 各种方式. 然后 网上大多数教程都是提前定义好 ...

  7. pos机的热敏纸尺寸

    57x50或者是57x30,两个型号宽度都是一样的,只是厚度不一样,前者是厚一点,适合固定机用,后者适合移动POS机用 厚度不是指纸的厚度,而是纸的容量,移动机的纸槽较小只能用57X30的

  8. 2015.3.2 VC++6制作非MFC dll以及VS2005、VS2010调用

    1.在VC6中新建工程,选择Win32 Dynamic-Link Libary,输入dll名称如 DLL2015 2.在类型选择中,选择第2项 A Simple Dll project OK 3.随后 ...

  9. enable or disable Oracle block change tracking

    Oracle的block change tracking用于记录上次备份以来改变过的block信息,因此打开block change tracking可以大大加快增量备份的速度. 1. Enable ...

  10. Javascript 面向对象(一):封装

    Javascript 面向对象编程(一):封装 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言, ...