zoukankan      html  css  js  c++  java
  • 2017.3.11[bzoj2440][中山市选2011]完全平方数

    线性筛+莫比乌斯函数裸题

    http://www.lydsy.com/JudgeOnline/problem.php?id=2440

    考虑二分答案,对于每个数看它是第几个,即对于这个数看比他小的有多少个素数的平方的倍数,减去,注意重复的要用容斥原理。

    然后对于容斥原理就跪了……一开始打的暴力dfs……

    事实上只要用莫比乌斯函数就好了。根据定义,莫比乌斯函数就体现了当前数是否是没有平方因子,且有k个不同的质因子的数。直接乘即可。

    没开够long longWA了一次……

     1 /**************************************************************
     2     Problem: 2440
     3     User: Super_Nick
     4     Language: C++
     5     Result: Accepted
     6     Time:6656 ms
     7     Memory:89192 kb
     8 ****************************************************************/
     9  
    10 #include<cmath>
    11 #include<queue>
    12 #include<cstdio>
    13 #include<vector>
    14 #include<cstdlib>
    15 #include<cstring>
    16 #include<iostream>
    17 #include<algorithm>
    18 #define RG register
    19 #define LYM 10000010
    20 #define K 1000000010
    21 #define inf 0x3f3f3f3f
    22 #define Inf 99999999999999999LL
    23 using namespace std;
    24 typedef long long LL;
    25 bool vis[LYM];
    26 LL l,r,ans,mid;
    27 int k,lim,top,T,num[LYM],sta[LYM];
    28 inline int gi(){
    29     RG int x=0;RG bool flag=0;RG char c=getchar();
    30     while((c<'0'||c>'9')&&c!='-') c=getchar();
    31     if(c=='-') c=getchar(),flag=1;
    32     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    33     return flag?-x:x;
    34 }
    35 inline void init(){
    36     num[1]=1;
    37     for (RG int i=2;i<LYM;++i){
    38     if(!vis[i]){
    39         num[i]=-1;
    40         sta[++top]=i;
    41     }
    42     for (RG int j=1;j<=top&&i*sta[j]<LYM;++j){
    43         vis[i*sta[j]]=1;
    44         if(i%sta[j]==0){
    45         num[i*sta[j]]=0;
    46         break;
    47         }
    48         else
    49         num[i*sta[j]]=-num[i];
    50     }
    51     }
    52 }
    53 inline bool check(){
    54     RG LL sum=0;
    55     lim=sqrt(mid);
    56     for (RG int i=1;i<=lim;++i)
    57     sum+=(LL)num[i]*((LL)mid/((LL)i*(LL)i));
    58     if(sum>=k) return 1;
    59     return 0;
    60 }
    61 inline void work(){
    62     k=gi();
    63     if(k==1){
    64     printf("1
    ");
    65     return;
    66     }
    67     l=k,r=1644934081;
    68     while(l<=r){
    69     mid=(l+r)>>1;
    70     if(check()) ans=mid,r=mid-1;
    71     else        l=mid+1;
    72     }
    73     printf("%lld
    ",ans);
    74 }
    75 int main(){
    76     init();T=gi();
    77     while(T--) work();
    78     return 0;
    79 }
    View Code
  • 相关阅读:
    2016.10.09
    Httpie 进行web请求模拟
    Python-集合
    python-字典
    MySQL权限系统
    MySQL8.0安装以及介绍(二进制)
    数据库对象中英文介绍
    Python-字符串
    GIT安装部署
    Cobbler安装部署
  • 原文地址:https://www.cnblogs.com/Super-Nick/p/6535880.html
Copyright © 2011-2022 走看看