链接:点我
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define N 50005 5 #define LL __int64 6 7 using namespace std; 8 9 LL st[N],total,h[15],n,flag[15]; 10 LL Dp[105][105],m; 11 12 void Dfs(int x,LL num)//递归求所有的组合 13 { 14 if(x>=n) 15 { 16 st[total++]=num; 17 return; 18 } 19 int i,k=-1; 20 if(num==0)k=0; 21 for(i=0;i<n;i++) 22 { 23 if(!flag[i] && h[i]!=k) 24 { 25 flag[i]=1; 26 Dfs(x+1,num*10+h[i]); 27 flag[i]=0; 28 k=h[i]; 29 } 30 } 31 } 32 33 void make() 34 { 35 int i,j,k; 36 for(i=0;i<n;i++) 37 { 38 flag[i]=0; 39 scanf("%I64d",&h[i]); 40 } 41 sort(h,h+n);//排序 42 total=0; 43 Dfs(0,0); 44 memset(Dp,-1,sizeof(Dp));//初始化 45 for(i=0;i<total;i++) 46 { 47 for(j=1;j<=100;j++) 48 { 49 k=st[i]%j; 50 if(Dp[j][k]==-1 || Dp[j][k]>st[i]) 51 { 52 Dp[j][k]=st[i];//预处理 53 } 54 } 55 } 56 LL x,y; 57 while(m--)//询问 58 { 59 scanf("%I64d%I64d",&x,&y); 60 if(y==1)printf("%I64d ",Dp[1][0]); 61 else 62 { 63 x%=y; 64 x=y-x;//互补 65 if(x==y)x=0; 66 if(Dp[y][x]==-1)printf("None "); 67 else printf("%I64d ",Dp[y][x]); 68 } 69 } 70 } 71 int main() 72 { 73 while(scanf("%I64d%I64d",&n,&m)==2) 74 { 75 make(); 76 } 77 return 0; 78 }