testC-I

总时间限制: 
20000ms
单个测试点时间限制: 
1000ms
内存限制: 
128000kB
描述

给你一组数,a1,a2,a3,⋯,an

令:G=gcd(a1,a2,a3,⋯,an)

现在从中任意删除一些数字,设剩下的数为:al1,al2,al3,⋯,alm

再令:g=gcd(al1,al2,al3,⋯,alm)

现要求G=g,问最多能删除多少数?

 

输入
第一行一个数n,第二行n个数a1,a2,a3,⋯,an。
输出
输出只有一个数,表示最多能删除多少数。
样例输入
3
4 6 8
样例输出
1
提示
1≤n≤700
1≤ai≤10000

 

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 const int INF=0x7f7f7f7f;
 7 
 8 int n;
 9 int a[705],f[10005];
10 
11 int read()
12 {
13     int x=0,f=1;char ch=getchar();
14     while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
15     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
16     return x*f;
17 }
18 
19 int gcd(int a,int b)
20 {
21     return b?gcd(b,a%b):a;
22 }
23 
24 int main()
25 {
26     n=read();
27     for(int i=1;i<=n;i++)
28         a[i]=read();
29     int g=0;
30     memset(f,0x7f,sizeof(f));
31     f[0]=0;
32     for(int i=1;i<=n;i++)
33     {
34         g=gcd(g,a[i]);
35         for(int j=10000;j>=0;j--)
36         {
37             int GCD=gcd(j,a[i]);
38             f[GCD]=min(f[GCD],f[j]+1);
39         }
40     }
41     printf("%d",n-f[g]);
42     return 0;
43 }

 

转载于:https://www.cnblogs.com/InWILL/p/6343230.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值