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 3 2 3 2 2 5
其中 质因数 2 的次数出现的最多,出现了4 次, 所以我们只要删除 n-4=2 个数就能使最大公约数由1 变成 2 。即删除 a[1]和a[3]就好,答案就是 2 。
综上,只要找出质因数出现的最多的次数d, n-d就是我们要的答案。
代码实现过程中,由于数据较大,要把筛质数 和 选因子 分开来做, 不能同时筛质因子(会超时),因为要避免筛质数这部分重复(打一次表就好)。 筛质数的时候,用2000以内的质数就够了(我也不知道为什么!)
顺便一提:一个数m 的因子个数k 是小于log2m的 , 因为2^k<m 。 还有 数组至少能开1.5e7 大 。
#include<iostream>
#include<cstdio>
#include <cctype>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<map>
using namespace std;
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
#define se second
#define fi first
const ll mod=1e9+;
const int INF= 0x3f3f3f3f;
const int N=3e5+; const int N2=1.5e7+;
int n;
int cnt=;
int check[];
int a[N];
int num[N2];
int prime[N]; int gcd(int x, int y)
{
return y==?x:gcd(y,x%y);
}
void _prime()
{
int m=;
for(int i=;i<=m;i++) //N以内的质数
{
if(!check[i])
{
prime[++cnt]=i;
for(int j=i;j<=m;j+=i)
{
check[j]=;
}
}
}
}
void factor(int m)
{
for(int i=;i<=cnt;i++)
{
if(m%prime[i]==)
num[prime[i] ]++;
while(m%prime[i]==)
{
m/=prime[i];
}
}
if(m!=) //包括了1
num[m]++;
} int main()
{
cin>>n;
for(int i=;i<=n;i++)
scanf("%d",&a[i]); int g=a[]; //g=删除前的最大公约数
for(int i=;i<=n;i++) g=gcd(g,a[i]); _prime();
for(int i=;i<=n;i++)
{
a[i]/=g;
factor(a[i]);
} int ans=INF;
for(int i=;i<=N2;i++)
{
if(num[i])
ans=min(ans,n-num[i]);
}
cout<< (ans<n? ans:- )<<endl;
}
Codeforces Round #511 (Div. 2) C. Enlarge GCD (质因数)的更多相关文章
- Codeforces Round #511 (Div. 2)-C - Enlarge GCD (素数筛)
传送门:http://codeforces.com/contest/1047/problem/C 题意: 给定n个数,问最少要去掉几个数,使得剩下的数gcd 大于原来n个数的gcd值. 思路: 自己一 ...
- Codeforces Round #511 (Div. 2) C. Enlarge GCD
题目链接 题目就是找每个数的最小素因子,然后递归除,本来没啥问题,结果今天又学习了个新坑点. 我交了题后,疯狂CE,我以为爆内存,结果是,我对全局数组赋值, 如果直接赋值,会直接在exe内产生内存,否 ...
- Codeforces Round #511 (Div. 2)
Codeforces Round #511 (Div. 2) #include <bits/stdc++.h> using namespace std; int n; int main() ...
- Codeforces Round #511 (Div. 2):C. Enlarge GCD(数学)
C. Enlarge GCD 题目链接:https://codeforces.com/contest/1047/problem/C 题意: 给出n个数,然后你可以移除一些数.现在要求你移除最少的数,让 ...
- 2018.9.21 Codeforces Round #511(Div.2)
只写了AB,甚至还WA了一次A题,暴露了蒟蒻的本质=.= 感觉考的时候有好多正确或和正解有关的思路,但是就想不出具体的解法或者想的不够深(长)(怕不是过于鶸) 话说CF的E题怎么都这么清奇=.= A. ...
- 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 integ ...
- Codeforces Round #554 (Div. 2)-C(gcd应用)
题目链接:https://codeforces.com/contest/1152/problem/C 题意:给定a,b(<1e9).求使得lcm(a+k,b+k)最小的k,若有多个k,求最小的k ...
- Codeforces Round #347 (Div.2)_A. Complicated GCD
题目链接:http://codeforces.com/contest/664/problem/A A. Complicated GCD time limit per test 1 second mem ...
- Codeforces Round #651 (Div. 2) A. Maximum GCD(数论)
题目链接:https://codeforces.com/contest/1370/problem/A 题意 有 $n$ 个数大小分别为 $1$ 到 $n$,找出两个数间最大的 $gcd$ . 题解 若 ...
随机推荐
- Redis概述与基本操作
redis教程 概述 redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(strin ...
- ovs 数据包的处理过程
Openvswitch的内核模块openvswitch.ko会在网卡上注册一个函数netdev_frame_hook,每当有网络包到达网卡的时候,这个函数就会被调用. static struct sk ...
- golang实现无限级菜单(beego框架下)
原文地址 http://www.niu12.com/article/37 golang实现无限级菜单(beego框架下) 数据表如下 -- ---------------------------- ...
- 【GStreamer开发】GStreamer播放教程05——色彩平衡
目标 亮度,对比度,色度和饱和度都是常见的视频调节参数,也是GStreamer里面设置色彩平衡的参数.本教程将展示: 如何发现可用的色彩平衡通道 如何改变它们 介绍 <GStreamer基础教程 ...
- clang, gcc, gdb
Clang 比 GCC 编译器的优势: 1 编译速度更快 2 编译产出更小 3 出错提示更友好,比如 clang 在编译过程可以直接指出相对简单的出错位置以及它 " 认为 " 正确 ...
- npm use local module
情况是这样的, 我一个Angular的项目和一个微信小程序要共用逻辑, 于是我就把它剥离出来一个Node类库, Angular倒是可以使用Reference去引用, 但是使用uniapp创建的微信小程 ...
- 在 Docker 中手工部署 ASP.NET Core 应用
另一篇:在 Visual Studio 中部署 ASP.NET Core 应用 操作步骤 1. 安装 Docker For Windows(安装之前 Windows 需要开启 Hyper-V 虚拟机 ...
- 2019ICPC南昌现场赛总结
非常可惜的一场比赛,多了60分钟罚时与银牌无缘.今年6场ICPC网络赛里面打的最差的就是南昌站,冥冥之中自有天意吧,最后被安排去了南昌. 开场被队友叫去先看的L,说是足球,发现就是简单模拟,就直接上机 ...
- 从零开始学Flask框架-002
Jinja2模板 默认情况下,Flask 在程序文件夹中的templates 子文件夹中寻找模板. Jinja2 中的extends 指令从Flask-Bootstrap 中导入bootstrap/b ...
- Django框架学习易错和易忘点
一.get在几处的用法 1.获取前端数据 request.POST.get('xxx') #当存在多个值时,默认取列表最后一个元素:所以当存在多个值时,使用getlist 2.获取数据库数据 mode ...