Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #pragma region includes and predefines
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <functional>
  6. #include <string>
  7. #include <cstring>
  8. #include <map>
  9. #include <unordered_map>
  10. #include <set>
  11. #include <unordered_set>
  12. #include <queue>
  13. #include <stack>
  14. #include <cmath>
  15.  
  16. #pragma GCC target("arch=sandybridge")
  17. #pragma GCC optimize("O3")
  18. #pragma GCC optimize("expensive-optimizations")
  19. #pragma GCC optimize("tree-parallelize-loops=4")
  20.  
  21. using namespace std;
  22.  
  23. #ifndef __typeof
  24. #define __typeof(T) decltype(T)
  25. #endif
  26.  
  27. //#define endl "\n"
  28. #define fs first
  29. #define sc second
  30. #define pb emplace_back
  31.  
  32. #define rep(i,a,b) for (__typeof(b) i = (a); i < (b); ++i)
  33. #define iter(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)
  34.  
  35. typedef long long ll;
  36. typedef unsigned long long ul;
  37. typedef pair<ll,ll> pl;
  38. typedef pair<ul,ul> pu;
  39. typedef vector<ll> vl;
  40. typedef vector<ul> vu;
  41. typedef vector<vl> vl2;
  42. typedef vector<vu> vu2;
  43.  
  44. #pragma GCC diagnostic ignored "-Wshift-count-overflow"
  45. const ll inf = ~(1<<31);
  46. const ul inf_u = ~(1<<32);
  47. #pragma GCC diagnostic pop
  48.  
  49. const double dlo = 1e-9;
  50. const double pi = acos(-1);
  51.  
  52. #pragma endregion
  53.  
  54.  
  55. ul k;
  56. ul arr[300010];
  57. vector<vector<ul>> mem(300010, vector<ul>(32,inf_u));
  58.  
  59.  
  60. struct graph
  61. {
  62.     vector<vector<pu>> edg;
  63.     graph(){}
  64.     graph(ul n){edg.resize(n);}
  65.     void connect1(ul v, ul u, ul w=1){edg[v].pb(pu{w,u});}
  66.     void connect(ul v, ul u, ul w=1){connect1(v,u,w);connect1(u,v,w);}
  67.  
  68.     ul dp(ul at, int bits, int cnt)
  69.     {
  70.         if(mem[at][bits]!=inf_u)return mem[at][bits];
  71.         if(cnt==k)return 1;
  72.         ul sm = (cnt==1?0:1);
  73.         rep(i,0,edg[at].size())
  74.         {
  75.             if(!((bits>>arr[edg[at][i].sc])&1))
  76.             {
  77.                 sm += dp(edg[at][i].sc,bits|(1<<arr[edg[at][i].sc]),cnt+1);
  78.             }
  79.         }
  80.         return mem[at][bits]=sm;
  81.     }
  82.  
  83. };
  84.  
  85.  
  86. int main()
  87. {
  88.     ios::sync_with_stdio(false);
  89.     cin.tie(NULL);
  90.    
  91.     ul n,m;
  92.     cin >> n >> m >> k;
  93.     graph g(n);
  94.     rep(i,0,n)
  95.     {
  96.         cin >> arr[i];
  97.     }
  98.     rep(i,0,m)
  99.     {
  100.         ul v,u;
  101.         cin >> v >> u;
  102.         g.connect(v-1,u-1);
  103.     }
  104.     ul ans = 0;
  105.     rep(i,0,n)
  106.     {
  107.         ans += g.dp(i,0|(1<<arr[i]),1);
  108.     }
  109.     cout << ans;
  110.  
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement