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 }

 

posted @ 2017-01-23 08:20  InWILL  阅读(378)  评论(0编辑  收藏  举报