「BZOJ 2440」完全平方数「数论分块」
题意
\(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」完全平方数「数论分块」的更多相关文章
- bzoj 3834 [Poi2014]Solar Panels 数论分块
3834: [Poi2014]Solar Panels Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 367 Solved: 285[Submit] ...
- bzoj 1257 [CQOI2007]余数之和——数论分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1257 \( n\%i = n - \left \lfloor n/i \right \rfl ...
- BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块
问题描述 BZOJ2301 LG2522 积性函数 若函数 \(f(x)\) 满足对于任意两个最大公约数为 \(1\) 的数 \(m,n\) ,有 \(f(mn)=f(m) \times f(n)\) ...
- 「BZOJ 2956」模积和
「BZOJ 2956」模积和 令 \(l=\min(n,m)\).这个 \(i\neq j\) 非常不优雅,所以我们考虑分开计算,即: \[\begin{aligned} &\sum_{i=1 ...
- 「BZOJ 4228」Tibbar的后花园
「BZOJ 4228」Tibbar的后花园 Please contact lydsy2012@163.com! 警告 解题思路 可以证明最终的图中所有点的度数都 \(< 3\) ,且不存在环长是 ...
- 「BZOJ 3645」小朋友与二叉树
「BZOJ 3645」小朋友与二叉树 解题思路 令 \(G(x)\) 为关于可选大小集合的生成函数,即 \[ G(x)=\sum[i\in c ] x^i \] 令 \(F(x)\) 第 \(n\) ...
- 「BZOJ 4502」串
「BZOJ 4502」串 题目描述 兔子们在玩字符串的游戏.首先,它们拿出了一个字符串集合 \(S\),然后它们定义一个字符串为"好"的,当且仅当它可以被分成非空的两段,其中每一段 ...
- 「BZOJ 4289」 PA2012 Tax
「BZOJ 4289」 PA2012 Tax 题目描述 给出一个 \(N\) 个点 \(M\) 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 \(1\) 到点 \( ...
- 「BZOJ 2534」 L - gap字符串
「BZOJ 2534」 L - gap字符串 题目描述 有一种形如 \(uv u\) 形式的字符串,其中 \(u\) 是非空字符串,且 \(v\) 的长度正好为 \(L\), 那么称这个字符串为 \( ...
随机推荐
- phpstorm下载和破解
http://idea.qinxi1992.cn/ 官网下载对应版本,在下面进行破解! storm官网:https://www.jetbrains.com/phpstorm/ 破解网址 :http: ...
- 对oracle中date/timestamp的操作
设置oracle中date的会话格式为 'yyyy-mm-dd hh24:mi:ss' alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss ...
- Doubango简介-sip
Welcome Android http://code.google.com/p/imsdroid/ http://code.google.com/p/imsdroid/source/browse/# ...
- 杂项:C# 方法、属性杂项-01
ylbtech-杂项:C# 方法.属性杂项-01 1. 属性杂项返回顶部 1. public int ReadCnt { get; set; } 2.设置默认值 public int ReadCnt ...
- RPCServiceClient-调用webservice客户端
import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.address ...
- HeapCreate深入研究
本机:win7(x86),4G内存 #include"stdafx.h"#include<windows.h>#include<stdio.h>#inclu ...
- redis学习四 复制
1,单机创建多实例 一个redis服务器安装多个redis实例,每个实例对应一个端口.默认端口是6379. 将redis.conf配置文件复制一份到另外一个文件夹下,然后修改其中的信息即可. pi ...
- java 多线程系列基础篇(七)之线程休眠
1. sleep()介绍 sleep() 定义在Thread.java中.sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”.sleep()会指定休眠时间,线 ...
- 通过XmlSerializer接口来生成xml文件
xml文件我们可以用来保存一些数据.例如用来备份短信.这个例子中,我们就用XmlSerializer接口来实现一个备份短信的程序.当然了,为了程序简单化,这个程序我们并不是真的去备份短信.我们通过一个 ...
- 转载-你应该知道的 RPC 原理
在校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互联网公司就会发现,公司的系 ...