#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 3e5 + 7;
int n , m , k, a[maxn] , dp[maxn][(1 << 5) + 5];
vector <int> g[maxn];
void solve()
{
cin >> n >> m >> k;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= m; i++)
{
int u , v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int u = 1; u <= n; u++)
{
a[u]--;
dp[u][(1 << (a[u]))] = 1;
}
for(int i = 1; i < k; i++)
{
for(int u = 1; u <= n; u++)
{
for(int v: g[u])
{
for(int mask = 1; mask < (1 << k); mask++)
{
if(__builtin_popcountll(mask) == i)
{
if(((mask >> a[v])&1) == 0)
{
dp[v][(mask | (1 << a[v]))] += dp[u][mask];
}
}
}
}
}
}
int ans = 0ll;
for(int i = 1; i <= n; i++)
{
for(int mask = 1; mask < (1 << k); mask++)
{
ans += dp[i][mask];
}
}
cout << ans - n << '\n';
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
//freopen("inp.txt" , "r" , stdin);
//freopen("out.txt" , "w" , stdout);
solve();
return 0;
}
/*
F: Fenwick tree + mảng hiệu -> update range -> sum
C: binary search
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |