zoukankan      html  css  js  c++  java
  • [Codeforces Round511C] Enlarge GCD

    [题目链接]

             https://codeforces.com/contest/1047/problem/C

    [算法]

            首先求出n个数的最大公约数g , 将每个数除以g , 那么 , 问题就转化为在n个数中选出一个数集 , 使得这个数集中的数最大公约数不为1 , 最大化数集大小

            预处理Ai范围内的质数 , 然后对于每个数分解质因数即可

            时间复杂度 : O(NlogN + N log V)

    [代码]

            

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN = 3e5 + 10;
    const int MAXP = 1.5e7 + 10;
    
    int n,tot;
    int a[MAXN],prime[MAXP],f[MAXP],cnt[MAXP];
    
    template <typename T> inline void read(T &x)
    {
        T f = 1; x = 0;
        char c = getchar();
        for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
        for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
        x *= f;
    }
    inline int gcd(int x,int y)
    {
            if (y == 0) return x;
            else return gcd(y,x % y);
    }
    
    int main()
    {
            
            read(n);
            for (int i = 1; i <= n; i++) read(a[i]);
            int g = a[1];
            for (int i = 2; i <= n; i++) g = gcd(g,a[i]);
            for (int i = 1; i <= n; i++) a[i] /= g;
            for (int i = 2; i < MAXP; i++)
            {
                    if (!f[i]) 
                    {
                            f[i] = i;
                            prime[++tot] = i;
                    }
                    for (int j = 1; j <= tot; j++)
                    {
                            int tmp = i * prime[j];
                            if (tmp > MAXP) break;
                            f[tmp] = prime[j];
                            if (prime[j] == f[i]) break;
                    }
            }
            int ans = -1;
            for (int i = 1; i <= n; i++)
            {
                    int pre = -1 , tmp = a[i];
                    while (tmp != 1)
                    {
                            if (f[tmp] == pre)
                            {
                                    tmp /= f[tmp];
                                    continue;
                            }
                            cnt[f[tmp]]++;
                            if (cnt[f[tmp]] > ans) ans = cnt[f[tmp]];
                            pre = f[tmp];
                            tmp /= f[tmp];
                    }        
            }
            if (ans == -1) printf("-1
    ");
            else printf("%d
    ",n - ans);
            
            return 0;
        
    }
  • 相关阅读:
    一个经典的页面布局
    巧避new的一个原型设计模式
    讲解关于javascript的继承
    根据指定日期 算出该周的一周日期
    原型实现的一个观察者模式
    减少类之间的耦合性
    Android 代码下载
    (转)open gl 实例 demo vs2005 环境
    Tile editor 快捷键
    这是第一篇博客~
  • 原文地址:https://www.cnblogs.com/evenbao/p/9714657.html
Copyright © 2011-2022 走看看