http://poj.org/problem?id=1426
测试了一番,从1-200的所有值都有long long下的解,所以可以直接用long long 存储
从1出发,每次向10*s和10*s+1转移,只存储余数即可,
对于余数i,肯定只有第一个余数为i的最有用,只记录这个值即可
#include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn=222; typedef long long ll; ll dp[maxn]; int n; queue<int >que; int main(){ while(scanf("%d",&n)==1&&n){ if(n==1){puts("1");continue;} memset(dp,-1,sizeof(dp)); while(!que.empty())que.pop(); dp[1]=1; que.push(1); bool fl=false; while(!que.empty()){ int s=que.front();que.pop(); if(s==0){ printf("%I64d ",dp[s]); fl=true; break; } int t=s*10%n; if(dp[t]==-1){ dp[t]=10*dp[s]; que.push(t); } t=(s*10+1)%n; if(dp[t]==-1){ dp[t]=10*dp[s]+1; que.push(t); } } if(!fl)puts("-1"); } return 0; }