#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int stack[105], tot;
int ans, a[105], A;
int n;
void dfs(int cur) {
//printf("cur = %d\n", cur );
if (cur == n) {
if (tot == 0) return ;
int x = A;
for (int i = 1; i <= tot; i++) x %= stack[i];
//for( int i = 1; i <= tot; i ++)
//printf("%d ", stack[i]);
//printf("\n");
if (x == 0) {
if (ans == -1) ans = tot;
else ans = min(tot, ans);
}
return ;
}
stack[++ tot] = a[cur];
//cout << "+++++++++++++++++++++++++++++++" << endl;
dfs(cur + 1);
//cout << "-------------------------------" << endl;
-- tot;
//printf("tot = %d\n", tot);
dfs(cur + 1);
}
void work() {
scanf("%d%d", &n, &A);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
sort(a, a + n); reverse(a, a + n);
tot = 0;
ans = -1;
dfs(0);
printf("%d\n", ans);
}
int main() {
int T;
scanf("%d", &T);
for (int cas = 1; cas <= T; cas++) {
work();
}
return 0;
}
题意:有一个整数a和n个整数b1,...,bn。挑选若干个数据重新排列,得到c1,...cr。保证a mod c1 mod c2 mod...mod cr =0。取最小的r。无解输出-1。
题解:第一次玩bestcoder..蛮好玩的..用了一个函数。用了一个全排列函数..(其实也可以自己手写一个全排列函数..)就是排序一次..全除一遍..如果不等于0 继续排序 继续除...(y = num[0])即取最小值。用于底下的判断(优化时间) (当被除数比最小值还小 直接弹出 进行下一轮循环)如果能整除 直接用goto End跳出二重循环..
编辑后:一开始以为过了hack就是AC没想到后面还有系统大数据判断 。就WA了(应该超时 毕竟全排列。)。本以为这道题就这么在草稿箱中自动腐化删除...后来波老师又拿这道题讲。用dfs深度查找..其实也是蛮难看懂是怎么写出来的..后来用那些注释掉的帮忙理解吧...总之还是得继续练吧。还没还没。