跟巧妙的一道题目,问n的最小的一个倍数,该倍数不含有任意给定的数位中的数字 N是1万,bfs可用的数位,每次只要考虑模N是否存在即可,最多搜素N次,非常巧妙的减枝
#include<stdio.h>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=105;
const int MOD=1e9+7;
int n,m,k;
void rd(int&x){
char ch;
for(ch=getchar();ch<'0' || ch>'9';ch=getchar());
x=0;
for(;ch>='0' && ch<='9';ch=getchar()) x=x*10+ch-'0';
}
int a[10];
bool check(long long x){
while(x){
int tmp=x%10;
if(a[tmp]) return false;
x/=10;
}
return true;
}
struct node{
int digit,m,f;
};
int vis[20005];
node q[20005];
void dfs(int x){
if(q[x].f==x){
printf("%d",q[x].digit);
return;
}
dfs(q[x].f);
printf("%d",q[x].digit);
}
int tot;
int b[10];
long long solve(){
if(tot==0) return -1;
memset(vis,0,sizeof vis);
int l=1,r=0;
for(int i=0;i<tot;i++) if(b[i]!=0 && !vis[b[i]%n]){
++r;
q[r]=node{b[i],b[i]%n,r};
vis[b[i]]=true;
}
while(l<=r){
node u=q[l++];
if(u.m==0){
dfs(l-1);
puts("");
return 1;
}
for(int i=0;i<tot;i++){
int tmp=(b[i]+u.m*10)%n;
if(vis[tmp]) continue;
vis[tmp]=true;
q[++r]=node{b[i],tmp,l-1};
}
}
return -1;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("aaa","r",stdin);
#endif
int T;
int x;
int cas=1;
while(~scanf("%d%d",&n,&m)){
memset(a,0,sizeof a);
int sum=0;
for(int i=1;i<=m;i++) {
scanf("%d",&x);
a[x]=1;
}
tot=0;
for(int i=0;i<=9;i++) if(!a[i]) b[tot++]=i;
printf("Case %d: ",cas++);
int res=solve();
if(res==-1) puts("-1");
}
return 0;
}