标签:define 答案 int dfs mod mem open i++ 范围
取模(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
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; #define M 100005 int T,n,a,c[25],ans; int Dfs(int x,int m,int num) { if(m==0) { ans=min(ans,num); return 0; } for(int i=x;i>=1;i--) if(m>=c[i]) Dfs(i,m%c[i],num+1); } int main() { // freopen("mod.in","r",stdin); // freopen("mod.out","w",stdout); scanf("%d",&T); while(T--) { memset(c,0,sizeof(c)); scanf("%d%d",&n,&a); for(int i=1;i<=n;i++) scanf("%d",&c[i]); sort(c+1,c+n+1); ans=25; Dfs(n,a,0); if(ans==25) ans=-1; printf("%d\n",ans); } fclose(stdin); fclose(stdout); return 0; }
标签:define 答案 int dfs mod mem open i++ 范围
原文地址:http://www.cnblogs.com/xiaoningmeng/p/6038193.html