您的位置:首页 > 其它

hdu 5339 Untitled

2015-08-01 21:49 225 查看

Untitled

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 166    Accepted Submission(s): 83


[align=left]Problem Description[/align]
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.

 

[align=left]Input[/align]
The first line contains one integer
T≤5,
which represents the number of testcases.

For each testcase, there are two lines:

1. The first line contains two integers n
and a
(1≤n≤20,1≤a≤106).

2. The second line contains n
integers b1,…,bn
(∀1≤i≤n,1≤bi≤106).

 

[align=left]Output[/align]
Print T
answers in T
lines.

 

[align=left]Sample Input[/align]

2
2 9
2 7
2 9
6 7

 

[align=left]Sample Output[/align]

2
-1

 
对于一组可能的答案ccc,如果先对一个觉小的cic_ic​i​​取模,再对一个较大的cjc_jc​j​​取模,那么这个较大的cjc_jc​j​​肯定是没有用的。因此最终的答案序列中的ccc肯定是不增的。那么就枚举选哪些数字,并从大到小取模看看结果是否是000就可以了。时间复杂度O(2n)O(2^n)O(2​n​​).从小到大枚举,就可以了,。复杂度o(2^n)

#define N 205
#define M 100005
#define maxn 205
#define MOD 1000000000000000007
int T,n,a,pri
,ans;
int Dfs(int x,int m,int num){
if(m == 0){
ans = min(ans,num);
return 0;
}
for(int i = x - 1;i>=0;i--){
if(m >= pri[i])
Dfs(i,m%pri[i],num+1);
}
}
int main()
{
while(S(T)!=EOF)
{
while(T--){
S2(n,a);
FI(n) S(pri[i]);
sort(pri,pri+n);
ans = INF;
Dfs(n,a,0);
if(ans == INF) ans = -1;
printf("%d\n",ans);
}
}
return 0;
}


[align=left]Source[/align]
BestCoder Round #49 ($)

 

[align=left]Recommend[/align]
hujie   |   We have carefully selected several similar problems for you:  5342 5341 5339 5338 5337 
 

Statistic | Submit | Discuss
| Note
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: