zoukankan      html  css  js  c++  java
  • Bzoj2440 完全平方数

    Time Limit: 10000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu

    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

    Source

    中山市选2011

    用莫比乌斯反演搞一搞。

    详细题解之后补

    ————————updated 2017.3

    震惊!一句详细题解之后补,竟然就拖了一年!

    根据莫比乌斯函数的定义,同一质因子出现多次的数,对应的mu值都是0

    要求1~n范围内有多少满足题意的数

    $ans=sum_{i=1}^{sqrt n} mu(i)*(n/(i*i))$

    二分答案即可

    ————————

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 const int mxn=50000;
     8 int pri[50005];
     9 int mu[50005];
    10 bool mark[50005];
    11 int cnt;
    12 long long n;
    13 long long ans;
    14 void getmu(){
    15     int i,j;
    16     mu[1]=1;
    17     for(i=2;i<=mxn;i++){
    18         if(!mark[i]) pri[++cnt]=i,mu[i]=-1;
    19         for(j=1;j<=cnt && pri[j]*i<=mxn;j++){
    20             mark[pri[j]*i]=1;
    21             if(i%pri[j]==0){
    22                 mu[i*pri[j]]=0;
    23                 break;    
    24             }
    25             else mu[i*pri[j]]=-mu[i];
    26         }
    27     }
    28     return;
    29 }
    30 long long calc(int x){
    31     long long ans=0;
    32     int t=sqrt(x);
    33     for(int i=1;i<=t;i++)
    34         ans+=x/(i*i)*mu[i];
    35     return ans;
    36 }
    37 int main(){
    38     getmu();
    39     int T;
    40     scanf("%d",&T);
    41     while(T--){
    42         scanf("%lld",&n);
    43         long long l=n,r=1644934081;
    44         while(l<=r){
    45             long long mid=(l+r)>>1;
    46             if(calc(mid)>=n)ans=mid,r=mid-1;
    47             else l=mid+1;
    48         }
    49         printf("%lld
    ",ans);
    50     }
    51     return 0;
    52 }
  • 相关阅读:
    13.Odoo产品分析 (二) – 商业板块(6) –采购(3)
    9.Odoo产品分析 (二) – 商业板块(4) –讨论(1)
    10.Odoo产品分析 (二) – 商业板块(5) –日历(1)
    8.Odoo产品分析 (二) – 商业板块(3) –CRM(2)
    7.Odoo产品分析 (二) – 商业板块(3) –CRM(1)
    the nearest point/vertex point of linestring
    Clojure的引用类型:var,ref,agent和atom
    clojure的delay future promise
    clojure的语法糖
    postgres select TOP X in group 查询每个组的前几名
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5656771.html
Copyright © 2011-2022 走看看