HDU5339——DFS——Untitled

There is an integer a and n integers b1,,bn. After selecting some numbers from b1,,bn in any order, say c1,,cr, we want to make sure that a mod c1 mod c2 mod mod cr=0 (i.e., a will become the remainder divided by ci each time, and at the end, we want a to become 0). Please determine the minimum value of r. If the goal cannot be achieved, print 1 instead.

 


Input
The first line contains one integer T5, which represents the number of testcases. 

For each testcase, there are two lines:

1. The first line contains two integers n and a (1n20,1a106).

2. The second line contains n integers b1,,bn (1in,1bi106).
 


Output
Print T answers in T lines.
 


Sample Input
2 2 9 2 7 2 9 6 7
 


Sample Output
2 -1
 


Source
 
/*
暴力枚举所有情况取最小值
*/
#include <bits/stdc++.h>
using namespace std;

const int MAX = 1e6 + 10;
int b[MAX];
int vis[22];
int n, a;
int ans;

bool cmp(int a, int b)
{
    return a > b;
}
void dfs(int m, int step)
{
    if(m == 0){
        ans = min(ans, step);
        return;
    }
    for(int i = 1; i <= n; i++){
        if(m >= b[i])
            dfs(m%b[i], step+1);
    }
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--){
        ans = 1111111;
        scanf("%d%d", &n, &a);
        for(int i = 1; i <= n; i++)
            scanf("%d", &b[i]);
        sort(b + 1, b + n + 1, cmp);
        dfs(a, 0);
        if(ans == 1111111) printf("-1\n");
        else  printf("%d\n", ans);
        }
    return 0;
}

  

posted @ 2015-08-02 15:27  Painting、时光  阅读(108)  评论(0编辑  收藏  举报