Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define MOD 1000000007
- const int N = 200005;
- ll int f_[N], _f[N];
- ll int pow(ll int a, ll int b, ll int m)
- {
- ll int ans=1;
- while(b)
- {
- if(b&1)ans=(ans*a)%m;
- b/=2;a=(a*a)%m;
- }
- return ans;
- }
- ll int modinv(ll int k)
- {
- return pow(k, MOD-2, MOD);
- }
- void _fp()
- {
- f_[0]=f_[1]=1;for(int i=2;i<N;i++)
- { f_[i]=f_[i-1]*i;f_[i]%=MOD;}
- _f[N-1]=modinv(f_[N-1]);
- for(int i=N-2;i>=0;i--)
- {
- _f[i]=_f[i+1]*(i+1);_f[i]%=MOD;
- }
- }
- ll int _nr_(ll int x, ll int y)
- {
- if(y>x)return 0ll;
- ll int _n=f_[x]; _n*=_f[y];
- _n%=MOD;_n*=_f[x-y];_n%=MOD;
- return _n;
- }
- int main() {
- int t;
- cin>>t;
- _fp();
- while(t--)
- {
- int n, m;
- cin>>n>>m;
- vector<vector<int>> graph(n);
- for(int i=0; i<m; i++)
- {
- int u, v;
- cin>>u>>v;
- u--, v--;
- graph[u].push_back(v);
- graph[v].push_back(u);
- }
- vector<int> a(n);
- for(auto &e: a) cin>>e;
- vector<int> ver;
- vector<int> vis(n);
- vector<ll int> f_(n+1);
- f_[0] = 1;
- for(int i=1; i<=n; i++)
- (f_[i] = f_[i-1]*1ll*i) %= MOD;
- map<int, int> mp;
- function<void (int)> DFS = [&](int u)
- {
- vis[u] = 1;
- ver.push_back(u);
- for(auto v: graph[u])
- {
- if(!vis[v])
- DFS(v);
- }
- };
- ll int ans = 1;
- vector<int> sz;
- for(int i=0; i<n; i++)
- {
- if(vis[i]) continue;
- ver.clear();
- DFS(i);
- mp.clear();
- for(auto e: ver) mp[a[e]]++;
- for(auto [x, cnt]: mp)
- (ans *= f_[cnt]) %= MOD;
- sz.push_back(ver.size());
- }
- int tot = sz[0];
- for(int i=1; i<sz.size(); i++)
- {
- (ans *= _nr_(tot+sz[i], sz[i])) %= MOD;
- tot += sz[i];
- }
- cout<<ans<<"\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment