/*the only decomposition theorem of a number of topics, of course, uses some tricks .*/#include<iostream>#include<cstdio>#include<cstring>#defineMAXN 30010using namespacestd;intn,m1,m2,prime[maxn],num,mi[maxn],s,s[maxn],ans=0x7fffffff, CNT;BOOLF[MAXN];voidGet_prime (intx) { for(intI=2; i<=x;i++) { if(f[i]==0) prime[++num]=i; for(intj=1; j<=num;j++) { if(i*prime[j]>x) Break; F[i*prime[j]]=1; if(i%prime[j]==0) Break; } }}voidGet_mi (intXinty) { if(x<2)return;//M1==1 will be re- for(intI=1;p rime[i]<=x;i++) { while(x%prime[i]==0) mi[i]++,x/=Prime[i]; if(x==1) Break; } for(intI=1; i<=m2;i++) Mi[i]*=y;}intClaintAintb) { if(A<B)return 0; intt=a/b; if(t*b==a)returnT; Else returnt+1;}intMain () {scanf ("%d%d%d",&n,&m1,&m2); Get_prime (M1); Get_mi (M1,M2); for(intk=1; k<=n;k++) {scanf ("%d", &s);intfalg=0, a=0; for(intI=1;p rime[i]<=m1;i++)//it's equivalent to decomposing M1, the M1 factor, to decompose Si .{cnt=0;if(!prime[i]) Break; while(s%prime[i]==0) cnt++,s/=Prime[i]; if(mi[i]&&!CNT) {Falg=1; Break; } if(mi[i]==0&&cnt==0)Continue; A=Max (A,CLA (mi[i],cnt)); } if(falg==0) ans=min (ans,a); } if(ans>=0x7fffff) printf ("-1\n"); Elseprintf"%d\n", ans); return 0;}
NOIP 2009 Cell Division