题意:
有一个整数a和n个整数b1,…,bn。在这些数中选出若干个数并重新排列,得到c1,…,cr。我们想保证a mod c1 mod c2 mod… mod cr=0。请你得出最小的r,也就是最少要选择多少个数字。如果无解,请输出−1.
题解:对于一组可能的答案c,如果先对一个觉小的ci取模,再对一个较大的cj取模,那么这个较大的cj肯定是没有用的。因此最终的答案序列中的c肯定是不增的。那么就枚举选哪些数字,并从大到小取模看看结果是否是0就可以了。时间复杂度O(2n).
//:直接DFS搞定
AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 30 int b[N]; int n,a; int MIN; void dfs(int cur,int x,int len) { if(x==0) MIN=min(MIN,len); if(cur==-1) return; dfs(cur-1,x,len); dfs(cur-1,x%b[cur],len+1); } int main() { int m; scanf("%d",&m); while(m--) { scanf("%d%d",&n,&a); int i; for(i=0;i<n;i++) { scanf("%d",&b[i]); } sort(b,b+n); MIN=30; dfs(n-1,a,0); if(MIN<30) { printf("%d\n",MIN); } else { printf("-1\n"); } } return 0; }