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

posted on 2005-10-28 16:36  Fancy Mouse  阅读(395)  评论(1编辑  收藏  举报