分析:给你数a和b1...bn,求在b1.....bn中选最少的数使a%c1%c2...=0。因为b数组最多就20个,可以暴力枚举所有情况,如果给出的数bi>a,就可以把这个数删掉了,枚举的时候要把大的数排在前面,不然先mod一个小的数再mod一个大的数,大的数就没用了。
# include <stdio.h>
# include <algorithm>
using namespace std;
int n,ans,b[20];
void Find(int i,int k,int a)//求在b[i]到b[n]中最少选多少个满足a%c1%c2%....=0
{
int t;
for(;i<n;i++)
if(a%b[i]==0)
{
ans=k<ans?k:ans;
return;
}
else//将问题转化为:a变成a%b[i],b数组只有b[i+1]到b[n],前面已经选了k个
Find(i+1,k+1,a%b[i]);
}
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int a,i,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&a);
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
if(b[i]>a)//如果b[i]>a,肯定不选,可以删掉不考虑
i--,n--;
}
sort(b,b+n,cmp);
ans=100;
Find(0,1,a);
if(ans==100)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}