题意

\(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. AD的差分输入与单端输入

    AD的差分输入与单端输入 单端输入,输入信号均以共同的地线为基准.这种输入方法主要应用于输入信号电压较高(高于1V),信号源到模拟输入硬件的导线较短(低于15 ft,1ft=304.8mm),且所有的 ...

  2. STM32 -- 故障记录

    1.串口2无法发送数据 1)串口2和串口1使用的时钟总线不同: usart1:RCC_APBPeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); usart2:R ...

  3. [转载]linux内核中的HZ介绍

    时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据 HZ 值来设定,HZ 是一个体系依赖的值,在 <Linux/param.h>中定义或该文件包含的某个子平台相关文件中.作为通用 ...

  4. AngularJS中的http服务的简单用法

    我们可以使用内置的$http服务直接同外部进行通信.$http服务只是简单的封装了浏览器原生的XMLHttpRequest对象. 1.链式调用 $http服务是只能接受一个参数的函数,这个参数是一个对 ...

  5. python web框架 Django基本操作

    django 操作总结! django框架安装: cmd安装: pip3 install django pycharm安装: 在python变量下 搜索 django 安装 创建django项目: c ...

  6. oracle——存储过程分页

    1.包头: CREATE OR REPLACE PACKAGE BAWQ_PROC_PAGE IS -- BAWQ_PROC_PAGE 是包头名 TYPE T_CURSOR IS REF CURSOR ...

  7. Qt opencv开发环境

    在.pro文件中添加 INCLUDEPATH += C:\opencv\build\include\ #头文件路径 C:\opencv\build\include\opencv\ C:\opencv\ ...

  8. css知多少(9)——float下篇(转)

    css知多少(9)——float下篇   float内容比较多,咱们分上.下两篇来介绍,上篇已经写完,这是下篇.建议大家先把上篇看了,再来看下文,精彩内容不要掠过啊. 1. 清除float <上 ...

  9. 用C++的基本算法实现十个数排序

    冒泡排序法 原理: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 冒泡排序算法的运作如下 ...

  10. SpringBoot12 QueryDSL02之利用QueryDSL实现多表关联查询

    1 业务需求 有的系统业务逻辑比较复杂,存在着多表关联查询的的情况,查询的内容不仅仅是单张表的的内容而是多张表的字段组合而成的,直接使用SplringDataJPA实现是比较复杂的,但是如果使用Que ...