BestCoder Round #49 ($) HDU 5339 Untitled(1001)

HDU 5339 Untitled

 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
問題描述
有一個整數aann個整數b_1, \ldots, b_nb1,,bn。在這些數中選出若干個數並重新排列,得到c_1, \ldots, c_rc1,,cr。我們想保證a \ mod \ c_1 \ mod \ c_2 \ mod \ldots \ mod \ c_r = 0a mod c1 mod c2 mod mod cr=0。請你得出最小的rr,也就是最少要選擇多少個數字。如果無解,請輸出-11.
輸入描述
輸入文件的第一行有一個正整數 T \leq 5T5,表示數據組數。

接下去有TT組數據,每組數據的第一行有兩個正整數nnaa (1 \leq n \leq 20, 1 \leq a \leq 10^{6}1n20,1a106).

第二行有nn個正整數b_1, \ldots, b_nb1,,bn (\forall 1\leq i \leq n, 1 \leq b_i \leq 10^{6}1in,1bi106).
輸出描述
輸出TTTT個數表示每次詢問的答案。
輸入樣例
2
2 9
2 7
2 9
6 7
輸出樣例
2
-1

出題人:

對於一組可能的答案cc,如果先對一個覺小的c_ici取模,再對一個較大的c_jcj取模,那麼這
個較大的c_jcj肯定是沒有用的。因此最終的答案序列中的cc肯定是不增的。那麼就枚舉選
哪些數字,並從大到小取模看看結果是否是00就可以了。時間複雜度O(2^n)O(2n).

/*
hdu5339
Exe.Time 0MS
Exe.Memory 1580K
1024 B 1024B
Language G++
Author zhaobing
*/
#include 
#include
#include
using namespace std;
int b[100];
int flag;
int cmp(int l,int r)
{
    return l=r) return ;
    fang(sum,r,k,i-1);
    if(sum>=b[i])   ///重要剪枝
        fang(sum%b[i],r,k+1,i-1);
}
int main()
{
    int t,i,j,n,a;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&a);
        for(i=0; i


發佈了19 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章