poj 1426 Find The Multiple
//给你一个整数 1<=n<=200 求它的非零倍数 这个倍数仅有0和1
// 可以看成从 1 100 1000 10^3 10^4 ... 10^n
// 选些数和是n的倍数 肯定是存在的
// 广搜 若余数重复就不用加入队列 这样最多就 200个方向
#include <iostream> #include <string> #include <queue> #include <cmath> #include <map> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define LL __int64 //#define LL long long #define N 1010 struct node { int num; int fa; int lf; }No[N]; int h[210]; void output(int id) { if(id) { output(No[id].fa); printf("%d",No[id].num); } } int main() { int n; int f,t; int id; queue<int> Q; while(scanf("%d",&n),n) { if(n==1) {printf("1\n");continue;} id=1; memset(h,0,sizeof(h)); Q.push(1); h[1]=1; No[id].num=1; No[id].fa=0; No[id].lf=1;id++; while(!Q.empty()) { f=Q.front(); Q.pop(); t=No[f].lf*10; int lft=t%n; if(!h[lft]){ h[lft]=1; if(lft==0){ No[id].fa=f; No[id].num=0; //No[id].lf=0; //id++; output(id); break; }else { No[id].fa=f; No[id].num=0; No[id].lf=lft; Q.push(id); id++; } } t=No[f].lf*10+1; lft=t%n; if(h[lft]) continue; h[lft]=1; if(lft==0){ No[id].fa=f; No[id].num=1; output(id); break; }else { No[id].fa=f; No[id].num=1; No[id].lf=lft; Q.push(id); id++; } } printf("\n"); while(!Q.empty()) Q.pop(); } return 0; }