中文题我就不多解释题意了.
一开始是暴力枚举,每组数据的复杂度高达o(8!*2000),必然导致TLE...
but 看到这个(0<=x<10^9,0<K<100),应该是要从K入手了
DP[i][j] 表示在这8!种组合数中,mod i==j的数的最小值,这个可以使用DFS方便的枚举,于是对于每组数据,复杂度降到了o(8!*100)
然后对于输入的X,K,看DP[K][(K-X%K)%K]是否存在,若存在,输出,否则输出"None";查询基本上是o(1).
#include <iostream>
#include <algorithm>
using namespace std;
#define inf 111111111
short a[9];
bool flag,hash[9];
int X,K,N,Q;
int DP[101][101];
void dfs(int cnt,int val)
{
int i,tmp;
if(cnt==N)
{
for(i=1;i<100;i++)
if(val<DP[i][(tmp=val%i)])
DP[i][tmp]=val;
return;
}
for(i=0;i<N;i++)
{
if(!hash[i])
{
if(a[i]==0&&cnt==0)continue;
hash[i]=true;
dfs(cnt+1,10*val+a[i]);
hash[i]=false;
}
}
}
int main()
{
int i,j,tmp;
while(scanf("%d%d",&N,&Q)!=EOF)
{
for(i=0;i<N;i++)scanf("%d",&a[i]);
sort(a,a+N);
memset(hash,false,sizeof(hash));
for(i=0;i<100;i++)for(j=0;j<100;j++)DP[i][j]=inf;
dfs(0,0);
while(Q--)
{
scanf("%d%d",&X,&K);
tmp=(K-X%K)%K;
if(DP[K][tmp]!=inf)
printf("%d/n",DP[K][tmp]);
else puts("None");
}
}
return 0;
}