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


    Description

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

    Solution

    二分答案,于是问题转化成了如何求出不含完全平方数因子的数

    【不知道为什么,这道题里1居然不是一个完全平方数,但如果是的话就没法做了】

    容斥原理:x以内有多少个不含完全平方数因子的数=0个质数的乘积的平方的倍数个数(1)-1个质数乘积的平方的倍数个数(2*2=4、3*3=9...)+2个质数乘积的平方的倍数个数(2*2*3*3=36...)-...

    于是就可以用上莫比乌斯函数了,线性筛求mu

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #define MAXN 50000
    using namespace std;
    typedef long long LL;
    int t,k;
    int pri[MAXN],cnt=0,mu[MAXN];
    bool jud[MAXN];
    void getmu()
    {
        mu[1]=1;
        for(int i=2;i<=MAXN;i++)
        {
            if(!jud[i])pri[++cnt]=i,mu[i]=-1;
            for(int j=1;pri[j]*i<=MAXN&&j<=cnt;j++)
            {
                jud[i*pri[j]]=1;
                if(i%pri[j]==0){mu[i*pri[j]]=0;break;}
                mu[i*pri[j]]=-mu[i]; 
            }
        }
    }
    LL check(LL x)
    {
        LL res=0;
        for(int i=1;i<=sqrt(x);i++)
        res+=x/(i*i)*mu[i];
        return res;
    }
    int main()
    {
        scanf("%d",&t);getmu();
        for(int i=1;i<=t;i++)
        {
            scanf("%d",&k);
            LL ans,l=1,r=2000000000;
            while(l<=r)
            {
                int mid=(l+r)>>1;
                if(check(mid)>=k)ans=mid,r=mid-1;
                else l=mid+1;
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    随机数
    ASP .NET下的301重定向如何做
    网站外部链接建设方案
    解析ASP.NET WebForm和Mvc开发的区别
    委托、匿名委托和lambda表达式
    图片垂直居中
    jquery函数写法
    [转]函数方法常用的动词
    CSS Hack
    富文本编辑器
  • 原文地址:https://www.cnblogs.com/Zars19/p/6684098.html
Copyright © 2020-2023  润新知