题意:用给定的m个数字,组成最小的n的倍数
解法:bfs+余数判重
当遍历到已经使用过的余数,就不用加入队列了。
a%n=e;
(a*10+b)%n = ?
a*10%n + b%n
=e*10%n+b%n
=(e*10+b)%n
代码
- /*************************************************************************
- > File Name: poj1465.cpp
- > Author: cy
- > Mail: 1002@qq.com
- > Created Time: 14/11/8 14:45:43
- ************************************************************************/
- #include<iostream>
- #include<cstring>
- #include <algorithm>
- #include<cstdlib>
- #include<vector>
- #include<cmath>
- #include<stdlib.h>
- #include<iomanip>
- #include<list>
- #include<deque>
- #include<map>
- #include <stdio.h>
- #include <queue>
- #define maxn 5000+5
- #define inf 0x3f3f3f3f
- #define INF 0x3FFFFFFFFFFFFFFFLL
- #define rep(i,n) for(i=0;i<n;i++)
- #define reP(i,n) for(i=1;i<=n;i++)
- #define ull unsigned long long
- #define ll long long
- #define cle(a) memset(a,0,sizeof(a))
- using namespace std;
- struct Node{
- int pre,r,d;
- }node[maxn];
- bool hash[maxn];
- int val[1000];int n,m;
- void input()
- {
- cin>>m;
- int i;rep(i,m){
- scanf("%d",&val[i]);
- }
- }
- void output(int x)
- {
- if(node[x].pre==-1){
- printf("%d",node[x].d);
- return;
- }
- output(node[x].pre);
- printf("%d",node[x].d);
- }
- void bfs()
- {
- int head,tail;
- head=tail=0;
- cle(hash);
- int i,j,k;
- rep(i,m){
- if(val[i]==0)continue;
- node[tail].pre=-1;node[tail].r=val[i]%n;node[tail++].d=val[i];
- }
- while(head<tail)
- {
- Node temp=node[head],te;
- if(temp.r==0){
- output(head);
- return;
- }
- rep(i,m){
- te.r=(temp.r*10+val[i])%n;
- te.d=val[i];
- te.pre=head;
- if(!hash[te.r]){
- node[tail++]=te;
- hash[te.r]=true;
- }
- }
- head++;
- }
- printf("0");
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("in.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- #endif
- while(cin>>n)
- {
- input();
- if(n==0){
- cout<<0<<endl;
- continue;
- }
- sort(val,val+m);
- bfs();
- printf("\\n");
- }
- return 0;
- }