题意:有一个整数a和n个整数b1,…,bn。在这些数中选出若干个数并重新排列,得到1,…,cr。我们想保证a mod c1 mod c2 mod… mod cr=0。请你得出最小的r,也就是最少要选择多少个数字。如果无解,请输出-1−1.
解法:dfs。水题,随便搜一下就好了。
代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include<time.h> #include<stdlib.h> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #define LL long long using namespace std; bool cmp(int a, int b) { return a > b; } int b[25]; int n; int ans; void dfs(int i, int mod, int step) { if(mod == 0) ans = min(ans, step); for(i = i + 1; i < n; i++) { if(b[i] > mod) continue; dfs(i, mod % b[i], step + 1); } } int main() { int T; while(~scanf("%d", &T)) { while(T--) { int a; scanf("%d%d", &n, &a); for(int i = 0; i < n; i++) scanf("%d", &b[i]); sort(b, b + n, cmp); ans = 25; for(int i = 0; i < n; i++) { if(b[i] > a) continue; dfs(i, a % b[i], 1); } if(ans != 25) printf("%d ", ans); else puts("-1"); } } return 0; }