• 关于公因子的讨论


    这类题其实就想说个优化:枚举倍数...

    可有讲O(n)优化成logn的...

    记得下次再看到这类题直接枚举倍数就可以了;

    贴两道水体:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1010000;
    int n,o2,f[N],s;//s表示当前输出到哪个数了... 
    inline int read()
    {
        int x=0,ff=1;
        char ch=getchar();
        while(!isdigit(ch)){if(ch=='-') ff=-1;ch=getchar();}
        while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
        return x*ff;
    } 
    inline void put(int x)
    {
        if(x<0) putchar('-'),x=-x;
        if(x>9) put(x/10);
        putchar(x%10+'0'); 
    }
    int main()
    {
        freopen("group.in","r",stdin);
        freopen("group.out","w",stdout);
        n=read();
        for(register int i=1;i<=n;++i) 
        {
            int x=read();
            o2=max(o2,x),f[x]++;
        }
        for(register int i=o2;i>=1;--i) //枚举所有因子... 
        {
            int cnt=0;
            for(register int j=1;j*i<=o2;++j)  //枚举倍数... 
                if(f[i*j]) cnt+=f[i*j];
            for(register int j=1;j<=cnt-s;++j) put(i),puts("");//输出. 
            if(cnt>=s) s+=cnt-s;               //如果这个因子输出过,则修改输出到哪个数了... 
            if(s>=n) break; 
        }
        return 0;
    }

    #include<bits/stdc++.h>
    #define max(a,b) (((a)>(b)?(a):(b)))
    using namespace std;
    const int N=1010000;
    int n,K,f[N],o;
    inline int read()
    {
        int x=0,ff=1;
        char ch=getchar();
        while(!isdigit(ch)){if(ch=='-') ff=-1;ch=getchar();}
        while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
        return x*ff;
    } 
    inline void put(int x)
    {
        if(x<0) putchar('-'),x=-x;
        if(x>9) put(x/10);
        putchar(x%10+'0'); 
    }
    int main()
    {
        freopen("1.in","r",stdin);
        n=read();K=read();
        if(K==0) {printf("0");return 0;}
        for(register int i=1;i<=n;++i) 
        {
            int x=read();o=max(o,x);
            f[x]++;
        } 
        for(register int i=o;i>=1;--i)
        {
            int cnt=0;
            for(register int j=1;j*i<=o;++j) if(f[i*j]) cnt+=f[i*j];
            if(cnt>=K) {put(i);return 0;} 
        }
        return 0;
    }

    ......

  • 相关阅读:
    python-局部变量与全局变量作用域
    python-函数(上):函数返回值、函数调用、前向引用
    python-文件读写
    python-输入和输出
    python-模块介绍及os模块的方法
    python-continue和break的区别
    python-for循环
    python-while循环
    python-三元运算和if...else
    python-数据类型(下) :byte、列表、元组、集合
  • 原文地址:https://www.cnblogs.com/gcfer/p/11646678.html
Copyright © 2020-2023  润新知