济南学习 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对他取模,先模一个小的数再模一个大的数肯定没啥卵用,所以我们要从大到小排序,优先模大的数,恩,就酱紫~~

posted @ 2016-11-08 16:28  浮华的终成空  阅读(106)  评论(0编辑  收藏  举报

Contact with me