#include <iostream>
#include <unordered_map>
#include <vector>
using
namespace
std;
const
long
long
modulo = 1000000007;
long
long
power(
long
long
a,
long
long
b,
long
long
curr_mod);
void
dfs(
int
i, vector<vector<
int
> >& adj,
vector<
bool
>& vis, vector<
long
long
>& ar,
unordered_map<
long
long
,
long
long
>& hm);
void
Count_sequences(
int
N,
int
M, vector<
long
long
>& A,
vector<vector<
int
> >& B,
vector<
long
long
>& fac);
int
main()
{
vector<
long
long
> fac(200001, 0);
fac[0] = 1;
for
(
int
i = 1; i <= 200000; i++)
fac[i] = (fac[i - 1] * i) % modulo;
int
N = 5;
int
M = 5;
vector<
long
long
> A = { 10, 12, 15, 20, 15 };
vector<vector<
int
> > B = {
{ 1, 2 }, { 2, 3 }, { 3, 4 }, { 4, 2 }, { 3, 1 }
};
Count_sequences(N, M, A, B, fac);
return
0;
}
void
Count_sequences(
int
N,
int
M, vector<
long
long
>& A,
vector<vector<
int
> >& B,
vector<
long
long
>& fac)
{
vector<vector<
int
> > adj(N);
vector<
bool
> Vis(N,
false
);
for
(
int
i = 0; i < N; i++)
adj[i] = vector<
int
>();
for
(
int
i = 0; i < M; i++) {
int
u = B[i][0] - 1;
int
v = B[i][1] - 1;
adj[u].push_back(v);
adj[v].push_back(u);
}
long
long
res = 1;
int
x = 0;
for
(
int
i = 0; i < N; i++) {
if
(!Vis[i]) {
unordered_map<
long
long
,
long
long
> Map;
dfs(i, adj, Vis, A, Map);
long
long
mul = 1, cn = 0;
for
(
const
auto
& set : Map) {
cn += set.second;
long
long
xx = set.second;
mul = (mul * fac[xx]) % modulo;
}
int
inn =
static_cast
<
int
>(cn);
long
long
y = fac[x + inn];
long
long
d1
= (power(fac[x], modulo - 2, modulo)
* power(fac[inn], modulo - 2, modulo))
% modulo;
long
long
fraction = (y * d1) % modulo;
res = (res * ((fraction * mul) % modulo))
% modulo;
x += inn;
}
}
cout << res << endl;
}
long
long
power(
long
long
a,
long
long
b,
long
long
curr_mod)
{
if
(b == 0)
return
1;
long
long
temp = power(a, b / 2, curr_mod) % curr_mod;
if
((b & 1) == 0)
return
(temp * temp) % curr_mod;
else
return
(((temp * temp) % curr_mod) * a) % curr_mod;
}
void
dfs(
int
i, vector<vector<
int
> >& adj,
vector<
bool
>& vis, vector<
long
long
>& ar,
unordered_map<
long
long
,
long
long
>& hm)
{
vis[i] =
true
;
hm[ar[i]] += 1;
for
(
int
it : adj[i]) {
if
(!vis[it])
dfs(it, adj, vis, ar, hm);
}
}