这道题直接暴力枚举复杂度为 n!*m
但是k<100 , 所以我们可以通过取模用dp[i][j] 表示k=i 时,-x取模k为j的最小值
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 using namespace std; 6 7 int vis[10] , n , m , x , k , num[10] , dp[102][102]; 8 const int INF = 1000000000; 9 void dfs(int t , int state) 10 { 11 if(t >= n){ 12 for(int i=1 ; i<=100;i++) 13 if(dp[i][state%i] > state) 14 dp[i][state%i] = state; 15 return; 16 } 17 for(int i=0;i<n;i++){ 18 if(!vis[i]){ 19 vis[i] = 1; 20 dfs(t+1 , state*10+num[i]); 21 vis[i] = 0; 22 } 23 } 24 } 25 26 int main() 27 { 28 // freopen("a.in","rb",stdin); 29 //cout<<10*9*8*7*6*5*4*3*2*1<<endl; 30 while(scanf("%d%d",&n,&m) == 2){ 31 for(int i=0;i<n;i++) 32 scanf("%d",num+i); 33 34 memset(vis,0,sizeof(vis)); 35 36 for(int i=0;i<=100;i++) 37 for(int j=0;j<=100;j++) dp[i][j] = INF; 38 39 for(int i=0;i<n;i++){ 40 if(num[i]){ 41 vis[i] = 1; 42 dfs(1,num[i]); 43 vis[i] = 0; 44 } 45 } 46 for(int i=0;i<m;i++) 47 { 48 scanf("%d%d",&x,&k); 49 if(dp[k][(((-x)%k)+k)%k] < INF) 50 printf("%d\n",dp[k][(((-x)%k)+k)%k]); //state+x = b*k -> state%k = (-x)%k 51 else puts("None"); 52 } 53 } 54 return 0; 55 }
时间: 2024-12-28 08:48:52