POJ 1465 Multiple
問題
与えられたm個の数字x1,x2,...,xmのみを使ってできる、最小のNの倍数を求めよ。
作れない場合は0を出力せよ。
制約条件
m個の数字は全て異なる。
0≦N≦5000
方針
先頭から数字を決めていく幅優先探索+経路復元。
余りをメモ化しておき、同じ余りが出てきたら探索を打ち切る。
あらかじめ数字を昇順にソートしておくことにより、
最初に得られた答えが、最小のNの倍数になっている。
N=0の場合を特別に処理をしないとゼロ除算でRuntime Errorになる。
ソースコード
int n,m,x[10]; int prev[5000], use[5000]; char ans[5000]; int main() { while(~scanf("%d",&n)){ scanf("%d",&m); rep(i,m)scanf("%d",x+i); sort(x,x+m); if(!n){ puts("0"); continue; } queue<int> q; rep(i,n)prev[i]=-1; rep(i,m)if(x[i])q.push(x[i]%n), prev[x[i]%n]=-2, use[x[i]%n]=x[i]; while(!q.empty()){ int c=q.front(); q.pop(); if(c==0){ int len=0; for(;c>=0;c=prev[c])ans[len++]='0'+use[c]; ans[len]=0; reverse(ans,ans+len); puts(ans); goto END; } rep(i,m){ int next=(c*10+x[i])%n; if(prev[next]==-1)use[next]=x[i], prev[next]=c, q.push(next); } } puts("0"); END:; } return 0; }