首页 > 代码库 > HDU1755

HDU1755

这道题直接暴力枚举复杂度为 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)%k51             else puts("None");52         }53     }54     return 0;55 }

 

HDU1755