【BZOJ2440】完全平方数 [莫比乌斯函数]

完全平方数

Time Limit: 10 Sec  Memory Limit: 128 MB
[Submit][Status][Discuss]

Description

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

Input

  包含多组测试数据。文件第一行有一个整数 T,表示测试
  数据的组数。
  第2 至第T+1 行每行有一个整数Ki,描述一组数据,含义如题目中所描述。

Output

  含 T 行,分别对每组数据作出回答。第 i 行输出相应的
  第 Ki 个不是完全平方数的正整数倍的数。

Sample Input

  4
  1
  13
  100
  1234567

Sample Output

  1
  19
  163
  2030745

HINT

  对于 100% 的数据有 1 ≤ Ki ≤ 10^9, T ≤ 50

Main idea

  询问第 k 个不含完全平方因子的数。

Source  

  显然我们可以简化一下问题,二分答案。那么我们就只需要知道:1~n中 不含完全平方因子 的数的个数。

  然后我们思考一下容斥,用(总数-完全平方数个数):完全平方数个数 = 至少有1个质数平方因子的数 + 至少2个质数平方因子的数 - 至少3个质数平方因子的数……
  也就是:奇数个质数平方因子的数 - 偶数个质数平方因子的数
  然后我们发现,那么可以枚举一个d,删除d^2相关,这时候系数也就是μ(d)。当d有奇数个质数因子的时候,删除的是有奇数个质数平方因子中d^2的倍数。
  整理成式子也就是:

Code

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<cmath>
 8 using namespace std;
 9 typedef long long s64;
10
11 const int ONE = 44725;
12
13 int T;
14 int n,m;
15 int prime[ONE],miu[ONE],isp[ONE],p_num;
16
17 int get()
18 {
19         int res=1,Q=1;  char c;
20         while( (c=getchar())<48 || c>57)
21         if(c==‘-‘)Q=-1;
22         if(Q) res=c-48;
23         while((c=getchar())>=48 && c<=57)
24         res=res*10+c-48;
25         return res*Q;
26 }
27
28 void Getmiu(int MaxN)
29 {
30         miu[1] = 1;
31         for(int i=2; i<=MaxN; i++)
32         {
33             if(!isp[i])
34                 isp[i] = 1, prime[++p_num] = i, miu[i] = -1;
35             for(int j=1; j<=p_num, i*prime[j]<=MaxN; j++)
36             {
37                 isp[i * prime[j]] = 1;
38                 if(i % prime[j] == 0)
39                 {
40                     miu[i * prime[j]] = 0;
41                     break;
42                 }
43                 miu[i * prime[j]] = -miu[i];
44             }
45         }
46 }
47
48 s64 Check(s64 n)
49 {
50         s64 res = 0 ,Q = sqrt(n);
51         for(int d=1; d<=Q; d++)
52             res += miu[d] * (n/(d*d));
53         return res;
54 }
55
56 void Solve()
57 {
58         n = get();
59         s64 l = 0, r = 2e9;
60         while( l < r-1 )
61         {
62             s64 mid = (l+r)>>1;
63             if(Check(mid) < n) l = mid;
64             else r = mid;
65         }
66
67         if(Check(r) <= n) printf("%d", r);
68         else printf("%d", l);
69         printf("\n");
70 }
71
72 int main()
73 {
74         Getmiu(ONE-1);
75         T = get();
76         while(T--)
77             Solve();
78 }
79 

时间: 2024-08-07 15:49:58

【BZOJ2440】完全平方数 [莫比乌斯函数]的相关文章

bzoj2440 [中山市选2011]完全平方数 莫比乌斯函数应用

先用二分把问题转化一下,然后利用容斥定理和莫比乌斯函数搞一搞就好了. /************************************************************** Problem: 2440 User: mybing Language: C++ Result: Accepted Time:4908 ms Memory:2556 kb ****************************************************************/

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

题目大意 给出一个数k,求第k个不是完全平方数个数的数字(这里的完全平方数并不包括1). 思路 首先介绍一下莫比乌斯函数(M?bius): μ(x)=? ? ? ? ? ? ?  1(?1) k 0 x=1能分解成k个不同的质因数的乘积其他情况 然后呢,由于莫比乌斯函数是个积性函数,于是我们就可以线性地求出所有需要的莫比乌斯函数值. 剩下的工作就是在外层套一个二分,转成判定问题,小于一个数的数字中有多少个数字不是完全平方数的倍数.这个东西用容斥乱搞一下就好了~ CODE #define _CRT

[中山市选2011]完全平方数 ——莫比乌斯函数

题意: 求第k大的,不是任意完全平方数(除了1)整数倍的数. 求第k大的不含有完全平方数因子的数. T<=50组询问,K<=1e9 题解: 考虑完全平方数的倍数,就直接考虑质数的平方数的倍数就好. 第k大直接求不好求.也不能循环判断. 因为大小是单调的(废话),所以可以二分. 对于mid,可以用所有的小于mid的质数平方数判断有多少个是不合法的. 但是,对于pri^2,prj^2 ,两者的最小公倍数即(pri*prj)^2的倍数会被多减一次. 所以考虑到了容斥...但是2^sum(pr)的复杂

BZOJ 2440 [中山市选2011]完全平方数 ——莫比乌斯函数

$\sum_{i=1}^n[i==d^2*p]$ 其中p无平方因子$=\sum_{d^2\mid n,d>=2}\sum_{i=1}^{\lfloor {n/d^2} \rfloor} \left| \mu(i) \right |$然后就成了计算$\left| \mu(i) \right |$ 的前缀和?但是貌似不太可能啊 然后我们重新考虑容斥.发现最终的结果 s=一个质数平方的倍数-两个质数乘积平方的倍数-三个的-五个的+6个的发现系数和$\mu$一样,然后就可以枚举d进行计算了$$\sum_

[BZOJ2440]完全平方数解题报告|莫比乌斯函数的应用

完全平方数 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱.  这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一个小X讨厌的数.他列出了所有小X不讨厌的数,然后选取了第 K个数送给了小X.小X很开心地收下了.  然而现在小 W 却记不起送给小X的是哪个数了.你能帮他一下吗? 还记得第一次接触这道题是一年前吧..那时候参加了一场某OJ的比赛 然后并不会做..在

[bzoj2440]完全平方数[中山市选2011][莫比乌斯函数][线性筛][二分答案]

题意:求第k个分解质因子后质因子次数均为一的数,即求第k个无平方因子数. 题解: 首先二分答案mid,那么现在就是要求出mid以内的无平方因子数的个数. 其次枚举$\sqrt{mid}$内的所有质数,由容斥原理 $Num=0个质数平方的倍数的数量(1的倍数)-1个质数平方的倍数的数量(9,25...的倍数)$ $+2个质数平方的倍数的数量(36,100...的倍数)...$ 可以发现对于一个数x,x的倍数数量对答案的贡献符号为$\mu(x)$. 例如:9的倍数数量最答案的贡献是$\mu(9)\l

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

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

BZOJ2440(完全平方数)二分+莫比乌斯容斥

题意:完全平方数是指含有平方数因子的数.求第ki个非完全平方数. 解法:比较明显的二分,getsum(int middle)求1-middle有多少个非完全平方数,然后二分.求1-middle的非完全平方数个数可以用总数减掉完全平方数个数.计算完全平方数的个数用容斥: 首先加上n/(2*2)+n/(3*3)+n/(5*5)+n/(7*7)...+...然后减掉出现两次的,然后加上三次的...奇加偶减.这就是mou的原型,用mou数组计算很简单: 代码: /********************

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

Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送一 个小X讨厌的数.他列出了所有小X不讨厌的数,然后选取了第 K个数送给了 小X.小X很开心地收下了. 然而现在小 W 却记不起送给小X的是哪个数了.你能帮他一下吗? Solution 二分答案,于是问题转化成了如何求出不含完全平方数因