Advertisement
kinhosz

Untitled

Oct 17th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int,int> ii;
  6.  
  7. map<ii,bool> mapa;
  8.  
  9. const ll mod = 1e9 + 7;
  10. ll dp[2005][1<<9 + 5];
  11. vector<bool> mark;
  12. vector<vector<int>> g;
  13.  
  14. ll solve(int u,int n,int e){
  15. ll ret = 0;
  16. if(u >= n) return 1;
  17.  
  18. int mask = 0;
  19.  
  20. for(int i=u-e;i<=u+e;i++){
  21. mask = (mask<<1);
  22. if(i >= 0 && i < n && mark[i] == false){
  23. mask = mask|(1);
  24. }
  25. }
  26.  
  27. if(dp[u][mask] != -1) return dp[u][mask];
  28.  
  29. for(auto v: g[u]){
  30. if(mark[v] == false){
  31. mark[v] = true;
  32. ret += solve(u+1,n,e);
  33. mark[v] = false;
  34. ret %= mod;
  35. }
  36. }
  37.  
  38. dp[u][mask] = ret;
  39.  
  40. return ret;
  41. }
  42.  
  43. int main(){
  44.  
  45. int n,e,k;
  46.  
  47. cin >> n >> e >> k;
  48.  
  49. mark.resize(n+1);
  50. for(int i=0;i<k;i++){
  51. int a,b;
  52. cin >> a >> b;
  53. a--;
  54. b--;
  55. mapa[{a,b}] = true;
  56. }
  57.  
  58. for(int i=0;i<n;i++){
  59. for(int j=0;j< (1<<9)+5;j++){
  60. dp[i][j] = -1;
  61. }
  62. }
  63. g.resize(n+1);
  64. for(int i=0;i<n;i++){
  65. for(int j=i-e;j<=i+e;j++){
  66. if(j >= 0 && mapa.count({i,j}) == 0 && j < n){
  67. g[i].push_back(j);
  68. //printf("%d -> %d\n",i,j);
  69. }
  70. }
  71. }
  72.  
  73. ll ans = solve(0,n,e);
  74.  
  75. cout << ans << endl;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement