zoukankan      html  css  js  c++  java
  • 完全平方数(bzoj 2440)

    Description

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

    Input

    包含多组测试数据。文件第一行有一个整数 T,表示测试
    数据的组数。 
    第2 至第T+1 行每行有一个整数Ki,描述一组数据,含义如题目中所描述。 

    Output

    含T 行,分别对每组数据作出回答。第 i 行输出相应的
    第Ki 个不是完全平方数的正整数倍的数。

    Sample Input

    4
    1
    13
    100
    1234567

    Sample Output

    1
    19
    163
    2030745

    HINT

    对于 100%的数据有 1 ≤ Ki ≤ 10^9,   T ≤ 50

    /*
        有一个很显然的结论是最后的答案肯定不超过n*2,然后接可以二分答案,接下来就是判断有多少<=x的数满足它的质因数的指数都是1。 
        一个方法是去排除所有i^2的倍数(i为素数),这会让人联想到容斥?
        ans=n-奇数个质数的平方的倍数的个数+偶数个质数的平方的倍数的个数。
        利用莫比乌斯函数可以完美的解决这个问题
                 
                 -1(i为奇数个素数的乘积)
        mul[i] = 1(i为偶数个素数的乘积) 
                 0(i有某个因数的指数不为1)
    */
    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #define N 100000
    #define lon long long
    #ifdef unix
    #define LL "%lld"
    #else
    #define LL "%I64d"
    #endif
    using namespace std;
    int f[N],prime[N],miu[N];lon n;
    void init(){
        miu[1]=1;
        for(int i=2;i<N;i++){
            if(!f[i]){
                prime[++prime[0]]=i;
                miu[i]=-1;
            }
            for(int j=1;j<=prime[0];j++){
                if(i*prime[j]>=N) break;
                f[i*prime[j]]=1;
                miu[i*prime[j]]=-miu[i];
                if(i%prime[j]==0){
                    miu[i*prime[j]]=0;
                    break;
                }
            }
        }
    }
    lon check(lon mid){
        lon t=sqrt(mid),tot=0;
        for(int i=1;i<=t;i++)
            tot+=miu[i]*(mid/(lon)(i*i));
        return tot;
    }
    int main(){
        int T;scanf("%d",&T);init();
        while(T--){
            scanf(LL,&n);
            lon l=1,r=n*2,ans;
            while(l<=r){
                lon mid=l+r>>1;
                if(check(mid)>=n) r=mid-1,ans=mid;
                else l=mid+1;
            }
            printf(LL,ans);printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    hadoop无法启动常见原因
    mahout版本兼容问题
    递归打印字符串
    斐波那契数列
    int('x', base)中的base参数
    打印的特殊符号
    位置参数,默认参数,非关键字可变长参数,关键字可变长参数
    try...except包含try...finally方法
    7.9 未解答
    对集合应用符号 | & ^
  • 原文地址:https://www.cnblogs.com/harden/p/6523349.html
Copyright © 2011-2022 走看看