zoukankan      html  css  js  c++  java
  • [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;
    }
  • 相关阅读:
    SGU 495 Kids and Prizes 概率DP 或 数学推理
    poj 2799 IP Networks 模拟 位运算
    uva 202 Repeating Decimals 模拟
    poj 3158 Kickdown 字符串匹配?
    uva 1595 Symmetry 暴力
    uva 201 Squares 暴力
    uva 1594 Ducci Sequence 哈希
    uva 1368 DNA Consensus String 字符串
    数字、字符串、列表的常用操作
    if条件判断 流程控制
  • 原文地址:https://www.cnblogs.com/Zars19/p/6684098.html
Copyright © 2011-2022 走看看