Untitled
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 570 Accepted Submission(s): 291
Problem Description
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
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).
Output
Print
T
answers in T
lines.
Sample Input
2 2 9 2 7 2 9 6 7
Sample Output
2 -1
Source
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5339
题目大意:重排列bi,问a对重排列的数不断取模最快能为0的取模次数
题目分析:其实是水题,首先对数字小的取完余后再对数字大的取余等于没取,所以先对大数字取余,从大到小排序,因为n很小,DFS随意搜,也可以用状态压缩做,把每个数字选或不选的状态二进制压缩
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int const MAX = 1 << 22; int const INF = 0x3fffffff; int b[25], sta[MAX]; int lowbit(int x) { return x & (-x); } bool cmp(int a, int b) { return a > b; } int main() { int T; scanf("%d", &T); while(T --) { memset(sta, 0, sizeof(sta)); int n, a; scanf("%d %d", &n, &a); for(int i = 1; i <= n; i++) scanf("%d", &b[i]); sort(b + 1, b + n + 1, cmp); for(int i = 1; i <= n; i++) sta[1 << (i - 1)] = b[i]; int cnt, ans = INF; for(int i = 1; i < (1 << n); i++) { int tmp = a; cnt = 0; for(int j = i; j > 0; j -= lowbit(j)) { tmp %= sta[lowbit(j)]; cnt ++; } if(tmp == 0) ans = min(ans, cnt); } if(ans == INF) printf("-1\n"); else printf("%d\n", ans); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。