【学术篇】bzoj2440 [中山市选2011]完全平方数

-题目の传送门-

题目大意: 找到第k个无平方因子数.

看到数据范围很大, 我们要采用比\(O(n)\)还要小的做法.
考虑如果前\(x\)个数中有\(k-1\)个无平方因子数, 而前\(x+1\)个数中有\(k\)个无平方因子数, 那么\(x\)即为所求.
而由某种我不会的方式可以证明出答案是不会超过\(2n\)的, 所以我们可以二分答案.
问题就转化成了求前\(x\)个数中有多少个无平方因子数.

所以我们就要把这些无平方因子数筛一下.
那么首先所有含有平方因子的数我们都不需要考虑, 因为它们的倍数一定会被比他们小的数先筛掉.
而对于剩下的数, 为了方便描述, 我们定义\(\omega(x)\)为\(1\sim n\)中有\(x\)个不同质因子的数的个数, 即
\[
\omega(x)=\sum_{i=1,i=\prod_{i=1}^kp_i}^N[k=x]
\]
那么根据容斥, 我们就可以得到如下的式子.
\[
ans=n-\frac n{\omega(1)^2}+\frac n{\omega(2)^2}-\frac n{\omega(3)^2}+...=n-\sum_{i=1}^k{\frac n{\omega(i)^2}}*(-1)^{i+1}
\]
然后我们发现我们这个好像是莫比乌斯函数??? 恰好包含平方的数的莫比乌斯函数是0, 所以我们整合一波就可以得到
\[
ans=\sum_{i=1}^{\left \lfloor \sqrt n \right \rfloor}\mu(i)*{\left \lfloor \frac n{i^2} \right \rfloor}
\]

这样我们枚举\(i\)就可以过啦~
时间复杂度\(O(T*log_2n*\sqrt n)\)

代码:

#include <cstdio>
const int N=45005;
int pr[N],mu[N],tot,n;
bool np[N];
void shai(){
    mu[1]=np[1]=1;
    for(int i=2,k;i<=45000;++i){
        if(!np[i]) pr[++tot]=i,mu[i]=-1;
        for(int j=1;j<=tot&&(k=i*pr[j])<=45000;++j){
            np[k]=1;
            if(i%pr[j]==0){mu[k]=0; break;}
            mu[k]=-mu[i];
        }
    }
}
inline bool check(int x,int s=0){
    for(int i=1;i*i<=x;++i)
        s+=x/(i*i)*mu[i];
    return s>=n;
}
int main(){ shai();
    int T; scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        int l=1,r=n<<1;
        while(l<r){
            int mid=(1LL*l+r)>>1;
            if(check(mid)) r=mid;
            else l=mid+1;
        }
        printf("%d\n",r);
    }
}

这个题并和莫比乌斯反演没什么关系, 算是莫比乌斯函数的一个小应用吧...

原文地址:https://www.cnblogs.com/enzymii/p/8421314.html

时间: 2024-07-30 22:14:53

【学术篇】bzoj2440 [中山市选2011]完全平方数的相关文章

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

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

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

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

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]完全平方数

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

【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 完全平方数 莫比乌斯函数+二分

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

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

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