bzoj 2440

题意:有一个从小到大的由不包含平方约数的数组成的数列,从1开始,求第k项。

“满足某种限制的数的第k个”+二分答案="前n个数有多少个数满足限制“

求[1,n]中有多少个数没有平方约数,我们考虑求满足要求的数的补集。

求[1,n]中有多少个数有平方约数,我们考虑枚举约数后用容斥解决。

设Ai为包含[1,n]中所有为pi*pi的倍数的数的集合,因为一个数存在平方约数当且仅当它是某个(可能不止一个)质数的平方的倍数,所有转换后的问题的答案是(假如1~sqrt(n)只有3个质数):

|A1 U A2 U A3 ... | = |A1|+|A2|+|A3|-|A1 and A2|-|A1 and A3|-|A2 and A3|+|A1 and A2 and A3|

我们发现是奇数个质数的积的倍数前面的符号都是-1,偶数个则是1,这正好符合Mobius函数的定义,于是我们可以枚举所有不包含平方因子的数i,然后floor(n/(i*i))为是它的倍数的数的个数,而它们前面的符号为mobius[i]。

 1 /**************************************************************
 2     Problem: 2440
 3     User: idy002
 4     Language: C++
 5     Result: Accepted
 6     Time:1232 ms
 7     Memory:1232 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <cmath>
12
13 int prm[6000], isnot[50010], mu[50010], ptot;
14
15 void init() {
16     mu[1] = 1;
17     for( int i=2; i<=50000; i++ ) {
18         if( !isnot[i] ) {
19             prm[++ptot]=i;
20             mu[i] = -1;
21         }
22         for( int j=1; j<=ptot && prm[j]*i<=50000; j++ ) {
23             isnot[i*prm[j]]=true;
24             if( i%prm[j]==0 ) {
25                 mu[i*prm[j]]=0;
26                 break;
27             }
28             mu[i*prm[j]]=-mu[i];
29         }
30     }
31 }
32 int calc( int n ) {
33     int rt = 0;
34     int maxi = (int)ceil(sqrt(n));
35     for( int i=1; i<=maxi; i++ )
36         rt += mu[i]*(n/(i*i));
37     return rt;
38 }
39 int nth( int k ) {
40     int lf=1, rg=2000000000;
41     while( lf<rg ) {
42         int mid=lf+((rg-lf)>>1);
43         int cnt=calc(mid);
44         if( cnt<k ) lf=mid+1;
45         else rg=mid;
46     }
47     return lf;
48 }
49
50 int main() {
51     int T;
52     init();
53     scanf( "%d", &T );
54     while( T-- ) {
55         int k;
56         scanf( "%d", &k );
57         printf( "%d\n", nth(k) );
58     }
59 }

时间: 2024-10-21 07:09:24

bzoj 2440的相关文章

[BZOJ 2440] [中山市选2011] 完全平方数 【二分 + 莫比乌斯函数】

题目链接:BZOJ - 2440 题目分析 首先,通过打表之类的方法可以知道,答案不会超过 2 * k . 那么我们使用二分,对于一个二分的值 x ,求出 [1, x] 之间的可以送出的数有多少个. 怎么来求呢?我们使用容斥原理. 先求出不能送的数(即含有平方因子的数)有多少个,然后用总数减去就可以了. 那么,就是 含有一个质数平方因子的数(2^2的倍数 + 3^2的倍数 + 5^2的倍数....) - 含有两个质数平方因子的数((2 * 3)^2的倍数 + (2 * 5)^2的倍数 + ...

BZOJ 2440: [中山市选2011]完全平方数 二分答案 + 容斥原理 + 莫比乌斯反演

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 第一道莫比乌斯反演的题目. 二分答案 + 容斥那里还是挺好想的. 二分一个答案val,需要[1, val]之间存在的合法数字个数 >= k即可. 怎么判断呢?可以容斥,开始的时候有ans = val个,但是这里明显有些数字不符合. ans -= ([1...val]中有多少个2^2倍  + [1...val]中有多少个3^2倍 + [1...val]中有多少个5^2倍) ...... 但是减

BZOJ 2440: [中山市选2011]完全平方数(二分答案 + 莫比乌斯函数 + 容斥原理)

传送门 2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2693  Solved: 1307[Submit][Status][Discuss] Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送

BZOJ 2440 完全平方数(莫比乌斯反演,容斥原理)

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 题意:求第K个没有平方因子的数 思路:首先,可以二分数字,然后问题就转变成x以内有多少无平方因子的数 根据容斥原理:x以内无平方因子数=1*无需是任何质数的倍数的数数量-1*至少是1个质数的平方的倍数的数数量+1*至少是2个质数的平方的倍数的数量-1*至少是3个质数的平方的倍数的数量............然后发现,莫比乌斯函数u[i]正好满足:当i是不同的质数乘积时,返回-1,有相同因子就

BZOJ 2440 完全平方数 (容斥+莫比乌斯反演+二分)

2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1673  Solved: 799 [Submit][Status][Discuss] Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一 个

BZOJ 2440 中山市市选2011 完全平方数

2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5127  Solved: 2492[Submit][Status][Discuss] Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一个小X讨厌

完全平方数(bzoj 2440)

Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一个小X讨厌的数.他列出了所有小X不讨厌的数,然后选取了第 K个数送给了小X.小X很开心地收下了. 然而现在小 W 却记不起送给小X的是哪个数了.你能帮他一下吗? Input 包含多组测试数据.文件第一行有一个整数 T,表示测试数据的组数.

【BZOJ 2440】[中山市选2011]完全平方数

Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一个小X讨厌的数.他列出了所有小X不讨厌的数,然后选取了第 K个数送给了小X.小X很开心地收下了. 然而现在小 W 却记不起送给小X的是哪个数了.你能帮他一下吗? Input 包含多组测试数据.文件第一行有一个整数 T,表示测试数据的组数.

BZOJ 2440 完全平方数

考虑二分答案.而且1..n中他喜欢的大概占3/5左右. 考虑莫比乌斯函数与容斥原理,得答案. #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #define maxn 100050 using namespace std; long long t,n,miu[maxn],prime[maxn],cnt=0; bool vis[maxn]; void get_table