济南学习 Day 5 T1 晚
取模(mod)
【题目描述】
有一个整数a和n个整数b_1, …, b_n。在这些数中选出若干个数并重新排列,得到c_1,…, c_r。我们想保证a mod c_1 mod c_2 mod … mod c_r=0。请你得出最小的r,也就是最少要选择多少个数字。如果无解,请输出-1.
【输入说明】
输入文件的第一行有一个正整数T,表示数据组数。
接下去有T组数据,每组数据的第一行有两个正整数n和a.
第二行有n个正整数b_1, …, b_n.
【输出说明】
一行,输出答案。
【样例输入】
2
2 9
2 7
2 9
6 7
【样例输出】
2
-1
【数据范围】
对于40%的数据,n<=8
对于100%的数据,T<=5,n<=20,1 <=a <=10^6,b_i<=10^6
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #define INF 2100000000
6 using namespace std;
7 int T,n,a[100000],ans,x;
8 int cmp(int x,int y)
9 {
10 return x>y;
11 }
12 void Dfs(int w,int t,int now)// w数组下标 now X现在的值 t 用了数组中的多少个数
13 {
14 if(t>=ans) return;
15 if(now==0) { ans=t;return; }
16 if(w==n+1) return;
17 Dfs(w+1,t,now);
18 Dfs(w+1,t+1,now%a[w]);
19 }
20 int main()
21 {
22 scanf("%d",&T);
23 while(T--)
24 {
25 scanf("%d%d",&n,&x);
26 memset(a,0,sizeof a );
27 for(int i=1;i<=n;i++)
28 scanf("%d",&a[i]);
29 sort(a+1,a+1+n,cmp);
30 ans=INF;
31 Dfs(1,0,x);
32 if(ans==INF) printf("-1\n");
33 else printf("%d\n",ans);
34 }
35 return 0;
36 }
思路:对于一个数X对他取模,先模一个小的数再模一个大的数肯定没啥卵用,所以我们要从大到小排序,优先模大的数,恩,就酱紫~~