用DP的思想保存已经求出的解的话速度会快一些。保存现今求出的所有取自x1~xm的数mod n的余数。扩展的时候就用一个余数乘以10,分别加上x1~xm,判断是否mod n为0,如果是,输出解,否则存入队列继续查找。#include<iostream>using namespace std;const int max_size = 0x40000;int queue[max_size];int num[10];int seq[10];int n,m;void Print(int i);int main(){ int data,i,j,temp,flag; cin>>data; while(data-- > 0) { cin>>n>>m; for(i=0;i<m;i++) { cin>>j; num[j] = 1; } //first process simple status. if( ((n%10 == 5) && (num[5] == 0 && num[0] == 0)) || ((n%10 == 0) && (num[0] == 0)) ) { cout<<"0\n"; goto finish; } if(n%2 == 0) { for(j=0,i=0;i<10;i+=2) if(num[i]) j=1; if(!j) { cout<<"0\n"; goto finish; } } //Sort number used for(i=0,j=0;i<10;i++) if(num[i]) { queue[j] = (seq[j] = i) % n; if(queue[j] == 0 && seq[j] != 0) { cout<<seq[j]<<endl; goto finish; } j++; } //i for status for(i=j;i<max_size;i++) { temp = (queue[i/m-1]*10 + seq[i%m]) % n; if(0 == temp) { for(j=i,flag=0;j>=0;j=j/m-1) if(seq[j%m] != 0) flag = 1; if(flag) { Print(i); goto finish; } } queue[i] = temp; } cout<<"0\n";finish: for(i=0;i<10;i++) num[i] = 0; } return 0;}void Print(int i){ char s[501],*p=s; *p++ = '\0'; while(i>=0) { *p++ = seq[i%m] + '0'; i = i / m - 1; } while(*--p) cout<<*p; cout<<endl;} 转载于:https://www.cnblogs.com/FancyMouse/articles/263948.html