2345 3 7 8 9 100 1 0
Case 1: 2345 Case 2: -1
题意:告诉一个数n,以及k个数字,求一个n的整数倍,并且这个倍数中不存在这k个数,求最小的倍数值。
#include <iostream> #include <stdio.h> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <queue> using namespace std; typedef __int64 ll; struct Node { int yu; int digit; int pre; int id; }f[1000009]; queue<int>q; int use[20]; int vis[1000009]; ll n; int k; int cnt; int ca; void output(int id)//数字可能很大,递归输出 { if(f[id].pre==-1)return; output(f[id].pre); printf("%d",f[id].digit); } int bfs() { f[0].yu=0; f[0].pre=-1; f[0].id=0; q.push(0); int t; cnt=1; while(!q.empty()) { t=q.front(); q.pop(); for(int i=0;i<=9;i++) { if(use[i]) continue; if(f[t].yu==0 && i==0) continue; int yu=(f[t].yu*10+i)%n; if(vis[yu]) continue; if(yu==0) { printf("Case %d: ",ca); output(t); printf("%d\n",i); return 1; } vis[yu]=1; f[cnt].digit=i; f[cnt].id=cnt; f[cnt].yu=yu; f[cnt].pre=t; q.push(cnt++); } } return -1; } int main() { ca=1; while(~scanf("%I64d%d",&n,&k)) { memset(vis,0,sizeof vis); memset(use,0,sizeof use); for(int i=0;i<k;i++) { int a; scanf("%d",&a); use[a]=1; } while(!q.empty()) q.pop(); int flag=bfs(); if(flag==-1) { printf("Case %d: ",ca); puts("-1"); } ca++; } return 0; }