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);
        }
    }
  • 相关阅读:
    HDU 1850 Being a Good Boy in Spring Festival
    UESTC 1080 空心矩阵
    HDU 2491 Priest John's Busiest Day
    UVALive 6181
    ZOJ 2674 Strange Limit
    UVA 12532 Interval Product
    UESTC 1237 质因子分解
    UESTC 1014 Shot
    xe5 android listbox的 TMetropolisUIListBoxItem
    xe5 android tts(Text To Speech)
  • 原文地址:https://www.cnblogs.com/akonoh/p/10216758.html
Copyright © 2011-2022 走看看