CF 1047 C. Enlarge GCD

传送门

[http://codeforces.com/contest/1047/problem/C]

题意

给你n个数,移除最少的数字是剩下的数字GCD大于初始GCD

思路

需要一点暴力的技巧,先求出初始GCD为g,并统计每个数字的个数这是减少复杂度的关键,令ans=0,我们从i=g+1开始枚举GCD为i的个数,进行统计每次更新ans=min(ans,n-cnt)

需要注意的是某个数的因子依然是那个数倍数的因子,如2 4 8.这样可以避免重复统计。具体看代码

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1.5e7+5;
int a[maxn],num[maxn];
int main(){
    int n,i,j,h;
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //freopen("in.txt","r",stdin);
    cin>>n;
        int g,m=0,ans=n;
    //  memset(a,0,sizeof(a));
        for(i=1;i<=n;i++){
            cin>>h;
            if(i==1) g=h;
            else g=__gcd(g,h);
            num[h]++;
            if(h>m) m=h;
        }
        //cout<<g<<endl;
        for(i=g+1;i<=m;i++){
            if(a[i]==0){
                int cnt=0;
                for(j=i;j<=m;j+=i)
                a[j]=1,cnt+=num[j];
                ans=min(ans,n-cnt);
            }
        }
        if(ans==n) cout<<-1<<endl;
        else cout<<ans<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/mch5201314/p/9699016.html

时间: 2024-10-09 17:21:21

CF 1047 C. Enlarge GCD的相关文章

Codeforces Round #511 (Div. 2)-C - Enlarge GCD (素数筛)

传送门:http://codeforces.com/contest/1047/problem/C 题意: 给定n个数,问最少要去掉几个数,使得剩下的数gcd 大于原来n个数的gcd值. 思路: 自己一开始想把每个数的因子都找出来,找到这些因子中出现次数最多且因子大于n个数的最大公约数的,(n - 次数 )就是答案.但是复杂度是1e9,差那么一点. 自己还是对素数筛理解的不够深.这道题可以枚举素数x,对于每个x,找到所有(a[i]/gcd(all)) 是x倍数的个数,就是一个次数.找这个次数的过程

CF 979D Kuro and GCD and XOR and SUM(异或 Trie)

CF 979D Kuro and GCD and XOR and SUM(异或 Trie) 给出q(<=1e5)个操作.操作分两种,一种是插入一个数u(<=1e5),另一种是给出三个数x,k,s(<=1e5),求当前所有数中满足,k|v,x+v<=s,且\(x\oplus v\)最大的v. 做法好神啊.关于异或的问题有一种常见做法,就是利用01trie来查找在一堆数里面,那个数与x的异或值最大.这道题就是这个思路.如果去掉k必须整除v这个条件,那么就转化成了上一个问题(只不过有最大

CF#511-C Enlarge GCD(gcd)

题意:给你一个序列,然后求删除几个数之后整个序列的最大公约数增大思路:我们首先要求出这个公共的gcd,然后要使gcd增大我们可以尝试对增加gcd并判断是否为存在某个数为该数的gcd同时统计个数,为公共gcd最大的即为最后所求的值.(增加上限就是到最大的那个数)范围为1~1e5,arr[i]为1.5e7 完整代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm>

C. Enlarge GCD Codeforces Round #511 (Div. 2)【数学】

题目: Mr. F has nn positive integers, a1,a2,-,an. He thinks the greatest common divisor of these integers is too small. So he wants to enlarge it by removing some of the integers. But this problem is too simple for him, so he does not want to do it by

CF1034A Enlarge GCD

题意:给你\(n\)个数,去掉尽量少的数使得剩下数的\(gcd\)比原来的大,无解输出\(-1\) 题目意思很简洁,想理出来一个清晰的思路却花了不少时间......首先先计算出总的\(GCD\),然后再把每个数都除去这个\(GCD\),接下来的事情就得仔细考虑一下了. 设\(M=max\left\{a[i]\right\}\),则若枚举\(1-M\)内所有质数(显然枚举质数比合数优)并一一判断在\(1-n\)中整除它们的数字的个数,复杂度为\(O(\frac{nM}{log\,M})\)必须爆炸

Codeforces Round #511 Div2 C. Enlarge GCD

http://codeforces.com/contest/1047/problem/C 问题 给一个序列 \(A\),计原序列所有数的最大公约数为 \(p\).现在要删除一些数形成一个新序列,计新序列所有数的最大公约数为 \(q\) 问最少删除多少数能使 \(q > p\). 题解 先求出 \(p\),然后枚举 \(q > p\),计算一下序列中 \(q\) 的倍数有哪些.注意到若存在 \(a | q\) 且 \(a > p\),那么 \(a\) 显然优于 \(p\),因此用一个类似筛

Codeforces Round #511 (Div. 2) C. Enlarge GCD (质因数)

题目 题意: 给你n个数a[1]...a[n],可以得到这n个数的最大公约数, 现在要求你在n个数中 尽量少删除数,使得被删之后的数组a的最大公约数比原来的大. 如果要删的数小于n,就输出要删的数的个数, 否则输出 -1 . 思路: 设原来的最大公约数为 g, 然后a[1]...a[n]都除以g ,得到的新的a[1]...a[n],此时它们的最大公约数一定是1 . 设除以g之后的数组a为: 1    2    3     6      8   10  则它们的质因数分别是:  1    2   

CodeForces 1047C Enlarge GCD(数论)题解

题意:n个数的gcd是k,要你删掉最少的数使得删完后的数组的gcd > k 思路:先求出k,然后每个数除以k.然后找出出现次数最多的质因数即可. 代码: #include<cmath> #include<set> #include<map> #include<queue> #include<cstdio> #include<vector> #include<cstring> #include <iostream

Codeforces Round #511 (Div. 2) C. Enlarge GCD

题目链接 题目就是找每个数的最小素因子,然后递归除,本来没啥问题,结果今天又学习了个新坑点. 我交了题后,疯狂CE,我以为爆内存,结果是,我对全局数组赋值, 如果直接赋值,会直接在exe内产生内存,否则只会在运行时才分配内存. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 1e7 + 5e6 + 10; 5 6 //线性素数筛 7 int prime[2000000],num_prime = 0;