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 }