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

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

PO姐讲的已经很明白了我为什么还要费劲写公式啊

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #define LL long long
 5 #define N (100000+1000)
 6 using namespace std;
 7
 8 LL T,x,k,vis[N],prime[N],mu[N],cnt;
 9
10 void Get_mu()
11 {
12     mu[1]=1;
13     for (int i=2; i<=100000; ++i)
14     {
15         if (!vis[i]){prime[++cnt]=i; mu[i]=-1;}
16         for (int j=1; j<=cnt && prime[j]*i<=100000; ++j)
17         {
18             vis[prime[j]*i]=true;
19             if (i%prime[j]==0) break;
20             mu[prime[j]*i]=-mu[i];
21         }
22     }
23 }
24
25 LL check(LL x)
26 {
27     LL ans=0;
28     for (LL i=1; i<=sqrt(x); ++i)
29         ans+=x/(i*i)*mu[i];
30     return ans;
31 }
32
33 int main()
34 {
35     scanf("%lld",&T);
36     Get_mu();
37     while (T--)
38     {
39         scanf("%lld",&k);
40         LL l=x,r=1e10,mid,now,ans;
41         while (l<=r)
42         {
43             mid=(l+r)>>1; now=check(mid);
44             if (now>=k) ans=mid,r=mid-1;
45             else l=mid+1;
46         }
47         printf("%lld\n",ans);
48     }
49 }

原文地址:https://www.cnblogs.com/refun/p/9556630.html

时间: 2024-10-14 02:09:46

2440. [中山市选2011]完全平方数【莫比乌斯函数】的相关文章

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

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

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 [中山市选2011]完全平方数 莫比乌斯函数应用

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

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

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

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

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

2440: [中山市选2011]完全平方数

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

[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]完全平方数(容斥原理/莫比乌斯函数+二分)

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

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

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 我觉得网上很多题解都没说清楚...(还是我太弱了? 首先我们可以将问题转换为判定性问题,即给出一个数x,有多少个小于x等于的数是不能分解的,即不是完全平方数(不包括1). 而每个数都可以写成质数积,那么显然只要质数的平方的倍数就可以代替所有数的平方的倍数. 考虑质数个数,假设质数集$P$,那么根据容斥原理,在x范围内的正整数能分解的个数有: $$(A_{p_1} + A_{p_2} + \c

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

[题意]T次询问第k小的非完全平方数倍数的数.T<=50,k<=10^9.(即无平方因子数--素因数指数皆为0或1的数) [算法]数论(莫比乌斯函数) [题解]考虑二分,转化为询问[1,x]中无平方因子数的个数(x最大为2n). 运用容斥,答案ans=x - 1个素数的平方的倍数的数的个数 + 2个素数的乘积的平方的倍数的数的个数-- 枚举i=[1,√x]的所有数字,系数是莫比乌斯函数,i的平方的倍数的数的个数就是n/(i^2). ans=x-Σμ(i)*n/(i^2),i∈[1,√x] 复杂