zoukankan      html  css  js  c++  java
  • 刷题记录【BZOJ2440 完全平方数】数论、组合数学、莫比乌斯函数

    小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些
    数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而
    这丝毫不影响他对其他数的热爱。
    这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一
    个小X讨厌的数。他列出了所有小X不讨厌的数,然后选取了第 K个数送给了
    小X。小X很开心地收下了。
    然而现在小 W 却记不起送给小X的是哪个数了。你能帮他一下吗?
    https://cn.vjudge.net/contest/210428#problem/J
    首先我们考虑任意整数n,[1,n]内的符合条件的数有多少
    显然我们只需要考虑质数的平方
    [1,n]内4的倍数有[n4][frac n 4]
    9的倍数有[n9][frac n 9]

    以次类推
    若用n减去它们的和,显然我们会发现多减了一部分
    考虑 36 的倍数,则36的倍数被减去了两次
    所以依照容斥原理应当加一次
    接下来我们继续分析,就会发现,当i偶数个质数乘积的时,[ni2][frac n {i^2}]符号为正,当为奇数个质数乘积时,符号为负
    这时自然想到了莫比乌斯函数
    μ(n)表示莫比乌斯函数,f(n)表示[1,n]内符合条件的答案数
    f(n)=i=1n[ni2]μ(i)f(n)=sum_{i=1}^{sqrt n}[frac n {i^2}]μ(i)
    接下来对于K,只需要二分查找就可以找到相应的n
    下面证明二分查找的上界为2K
    证明:
    f(n)=i=1n[ni2]μ(i)ni=2nni2>nπ26n>n2f(n)=sum_{i=1}^{sqrt n}[frac n {i^2}]μ(i)≥n-sum_{i=2}^{sqrt n}frac n {i^2}> n- frac {π^2} 6 n > frac n 2
    所以f(2k)>kf(2k)>k
    下面是代码

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    #define N 100000
    #define ll long long
    int mu[N+5],prime[N+5],tot,t;
    bool notprime[N];
    void init()
    {
        notprime[1]=1;
        mu[1]=1;
        for(int i = 2 ; i <= N; i ++)
        {
            if(!notprime[i])
            {
                prime[++tot]=i;
                mu[i]=-1;
            }
            for(int j = 1 ; j <= tot && i  *prime[j] <= N ;  j++)
            {
                notprime[i*prime[j]]=1;
                if(i%prime[j]!=0)
                {
                    mu[i*prime[j]]=-mu[i];               
                }
                else break;
            }
        }
    }
    int main()
    {
        init();
        scanf("%d",&t);
        while(t--)
        {
            ll n;
            scanf("%lld",&n);
            ll l = 1,r = 2LL*n;
            while(l<=r)
            {
                ll mid = (l+r)>>1;
                ll ans = 0;
                for(ll i =1 ; i * i <= mid ; i++)
                {
                    ans += (mid/(i*i))*mu[i];
                }
                if(ans < n)
                {
                    l = mid+1;
                }
                else r = mid-1;
            }
            printf("%lld
    ",l);
        }
    }
  • 相关阅读:
    Struts2再曝高危漏洞(S2-020补丁绕过)
    JavaWeb学习总结(十三)——使用Session防止表单重复提交
    JavaWeb学习总结(十二)——Session
    javaweb学习总结(十一)——使用Cookie进行会话管理
    如何做个好员工(转载)
    剖析云计算中的“共享型数据库”(转载)
    云计算的基本概念(转载)
    javaweb学习总结(十)——HttpServletRequest对象(一)
    javaweb学习总结(九)—— 通过Servlet生成验证码图片
    javaweb学习总结(八)——HttpServletResponse对象(二)
  • 原文地址:https://www.cnblogs.com/akonoh/p/10216758.html
Copyright © 2011-2022 走看看