Ankit_132

D

Oct 25th, 2023
409
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define MOD 1000000007
  6. const int N = 200005;
  7. ll int f_[N], _f[N];
  8.  
  9. ll int pow(ll int a, ll int b, ll int m)
  10. {
  11.     ll int ans=1;
  12.     while(b)
  13.     {
  14.         if(b&1)ans=(ans*a)%m;
  15.         b/=2;a=(a*a)%m;
  16.     }
  17.     return ans;
  18. }
  19.  
  20. ll int modinv(ll int k)
  21. {
  22.     return pow(k, MOD-2, MOD);
  23. }
  24.  
  25. void _fp()
  26. {
  27.     f_[0]=f_[1]=1;for(int i=2;i<N;i++)
  28.     { f_[i]=f_[i-1]*i;f_[i]%=MOD;}
  29.     _f[N-1]=modinv(f_[N-1]);
  30.     for(int i=N-2;i>=0;i--)
  31.     {
  32.         _f[i]=_f[i+1]*(i+1);_f[i]%=MOD;
  33.     }
  34. }
  35.  
  36. ll int _nr_(ll int x, ll int y)
  37. {
  38.     if(y>x)return 0ll;
  39.     ll int _n=f_[x]; _n*=_f[y];
  40.     _n%=MOD;_n*=_f[x-y];_n%=MOD;
  41.     return _n;
  42. }
  43.  
  44. int main() {
  45.     int t;
  46.     cin>>t;
  47.    
  48.     _fp();
  49.    
  50.     while(t--)
  51.     {
  52.         int n, m;
  53.         cin>>n>>m;
  54.  
  55.         vector<vector<int>> graph(n);
  56.         for(int i=0; i<m; i++)
  57.         {
  58.             int u, v;
  59.             cin>>u>>v;
  60.  
  61.             u--, v--;
  62.  
  63.             graph[u].push_back(v);
  64.             graph[v].push_back(u);
  65.         }
  66.  
  67.         vector<int> a(n);
  68.         for(auto &e: a)     cin>>e;
  69.  
  70.         vector<int> ver;
  71.         vector<int> vis(n);
  72.         vector<ll int> f_(n+1);
  73.         f_[0] = 1;
  74.         for(int i=1; i<=n; i++)
  75.             (f_[i] = f_[i-1]*1ll*i) %= MOD;
  76.  
  77.         map<int, int> mp;
  78.  
  79.         function<void (int)> DFS = [&](int u)
  80.         {
  81.             vis[u] = 1;
  82.             ver.push_back(u);
  83.  
  84.             for(auto v: graph[u])
  85.             {
  86.                 if(!vis[v])
  87.                     DFS(v);
  88.             }
  89.         };
  90.  
  91.         ll int ans = 1;
  92.         vector<int> sz;
  93.  
  94.         for(int i=0; i<n; i++)
  95.         {
  96.             if(vis[i])      continue;
  97.  
  98.             ver.clear();
  99.             DFS(i);
  100.  
  101.             mp.clear();
  102.  
  103.             for(auto e: ver)    mp[a[e]]++;
  104.  
  105.             for(auto [x, cnt]: mp)
  106.                 (ans *= f_[cnt]) %= MOD;
  107.  
  108.             sz.push_back(ver.size());
  109.         }
  110.  
  111.         int tot = sz[0];
  112.  
  113.         for(int i=1; i<sz.size(); i++)
  114.         {
  115.             (ans *= _nr_(tot+sz[i], sz[i])) %= MOD;
  116.             tot += sz[i];
  117.         }
  118.  
  119.         cout<<ans<<"\n";
  120.     }
  121. }
  122.  
Advertisement
Add Comment
Please, Sign In to add comment