POJ 1426 Find the Multiple 思路,线性同余,搜索 难度:2

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\n",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;

}

  

你可能感兴趣的:(find)