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$ . 题解 若 ...
随机推荐
- 时空卷积网络TCN
1.写在前面 实验表明,RNN 在几乎所有的序列问题上都有良好表现,包括语音/文本识别.机器翻译.手写体识别.序列数据分析(预测)等. 在实际应用中,RNN 在内部设计上存在一个严重的问题:由于网络一 ...
- python:如何传递一个列表参数
- php is_writeable函数bug问题
其中bug存在两个方面,1.在windowns中,当文件只有只读属性时,is_writeable()函数才返回false,当返回true时,该文件不一定是可写的.如果是目录,在目录中新建文件并通过打开 ...
- LeetCode 671. 二叉树中第二小的节点(Second Minimum Node In a Binary Tree) 9
671. 二叉树中第二小的节点 671. Second Minimum Node In a Binary Tree 题目描述 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 ...
- Ly与lyon的巅峰对决,描色法
http://paste.ubuntu.com/14124956/ #include <stdio.h> #include <stdlib.h> struct node { i ...
- 转:路由 router-view
原文链接: 路由 router-view 路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容.H ...
- Java基础笔试练习(一)
1. 若在某一个类定义中定义有如下的方法: abstract void performDial( ); 该方法属于() ? A.本地方法 B.最终方法 C.静态方法 D.抽象方法 答案: D 解析: ...
- PAT(B) 1084 外观数列(Java)
题目链接:1084 外观数列 (20 point(s)) 题目描述 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, - 它从不等于 ...
- PowerBuilder学习笔记之行删除卡死问题
在数据窗口勾选这两个选项后,在删除行数据时会导致系统直接崩溃退出
- ReflectionTest:由输入的类名得到类的信息
package reflection; import java.lang.reflect.*; import java.util.*; public class ReflectionTest { pu ...