用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;
}
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;
}