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);
        }
    }
  • 相关阅读:
    多尺度目标检测 Multiscale Object Detection
    转置卷积Transposed Convolution
    Fine-Tuning微调原理
    eclipse中alt+/失效的几种解决方法
    错误笔记 对象为null时调用改对象的方法会报错
    JAVA -数据类型与表达式---变量与赋值
    错误笔记 3 变量值未初始化
    JAVA BigDecimal 用法
    JDBC url连接字符串错误1
    JDBC连接最新版Mysql数据库url设置
  • 原文地址:https://www.cnblogs.com/akonoh/p/10216758.html
Copyright © 2011-2022 走看看