zoukankan      html  css  js  c++  java
  • 关于公因子的讨论

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

    可有讲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;
    }

    ......

  • 相关阅读:
    支持向量机SVM知识梳理和在sklearn库中的应用
    Android P HIDL demo代码编写 (原创)
    Android P HIDL服务绑定模式与直通模式的分析 (原创)
    NFCApplication 启动分析(原创)
    Android native进程间通讯的实例 (原创)
    android 6.0 高通平台sensor 工作机制及流程(原创)
    NFC OMA 访问
    NXP NFC移植及学习笔记(原创)
    自定义View实战
    从0开始学自定义View -1
  • 原文地址:https://www.cnblogs.com/gcfer/p/11646678.html
Copyright © 2011-2022 走看看