Description
A program that, given a natural number N between 0 and 4999 (inclusively), and m distinct decimal digits X1, x2 .. XM (at least one), finds the smallest strictly positive multiple of n that has no other digits besides X1, x2 .. XM (if such a multiple exists ).
The input file has several data sets separated by an empty line, each data set having the following format:
On the first line-the number n
On the second line-the number m
On the following M lines-the digits X1, x2.. XM.
For each data set, the program shocould write to standard output on a single line the multiple, if such a multiple exists, and 0 otherwise.
An example of input and output:
Input
22
3
7
0
1
2
1
1
Output
110
0
Let you use M to form a multiple of N, with the minimum requirement
Train of Thought: First we sort the number of M, and then start to search from the high level to ensure that the first BFS is the smallest. Here we use a pruning rule for: the remainder is the same, we can use it to determine the weight, the small is better, that is, the first to put in the queue is better
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int maxn = 10005;struct Node {int res;int pre;int digit;} q[maxn];int a[maxn], vis[maxn];int n, m;void print(int u) {if (q[u].pre == -1)return;print(q[u].pre);printf("%d", q[u].digit);}int bfs() {q[0].digit = 0;q[0].pre = -1;q[0].res = 0;memset(vis, 0, sizeof(vis));int front = 0, rear = 1;while (front < rear) {Node tmp = q[front];for (int i = 0; i < m; i++) {int t = (tmp.res * 10 + a[i]) % n;if (a[i] == 0 && tmp.pre == -1)continue;if (!vis[t]) {vis[t] = 1;Node tmp;tmp.digit = a[i];tmp.pre = front;tmp.res = t;q[rear++] = tmp;}if (t == 0) {print(rear-1);printf("\n");return 1;}}front++;}return 0;}int main() {while (scanf("%d%d", &n, &m) != EOF) {for (int i = 0; i < m; i++)scanf("%d", &a[i]);if (n == 0) {printf("0\n");continue;}sort(a, a+m);if (!bfs())printf("0\n");}return 0;}
Zoj-1136 multiple (same remainder + BFS)