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;
        
    }
  • 相关阅读:
    开门(open_door_pick_demo.py)的学习教程(十一)
    Bert源码解读(二)
    Transformer和Bert 的学习(一)
    Android笔记
    JSP 第八周课后作业
    JSPd第七周课后作业 2021/04/14
    JSP第六次课后作业 2021/04/07
    JSP第五次课后作业 2021/03/31
    JSP第四次课后作业 2021/03/24
    JSP第二次课后作业 2021/03/10
  • 原文地址:https://www.cnblogs.com/evenbao/p/9714657.html
Copyright © 2011-2022 走看看