#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int,int> pi;
typedef vector<pi> pii;
typedef tuple<int,int,int> ti;
typedef vector<ll> li;
typedef vector<li> lii;
#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define LSOne(s) ((s)&(-s))
#define all(x) x.begin(),x.end()
ll INF=1000000000000000010;
int inf=1e9+10;
ll M=1e9+7;
int n,m,k;
vi a;
vii b;
vector<vector<ll>> cnt,cnt2,cnt3;
int main() {
// ios::sync_with_stdio(0);
// cin.tie(0);
// freopen("test_input.txt", "r", stdin);
// freopen("test_output.txt", "w", stdout);
cin>>n>>m>>k;
a.resize(n);
REP(i,0,n)cin>>a[i];
REP(i,0,n)a[i]--;
b.resize(n);
cnt.resize(n,vector<ll>(5,0));cnt2.resize(n,vector<ll>(10,0)),cnt3.resize(n,vector<ll>(10,0));
REP(i,0,m){
int x,y;cin>>x>>y;
x--;y--;
b[x].PB(y);
b[y].PB(x);
cnt[x][a[y]]++;
cnt[y][a[x]]++;
}
if(k==1){
cout<<0;
return 0;
}
ll ans=0;
REP(i,0,n)REP(j,0,5)if(a[i]!=j)ans+=cnt[i][j];
if(k>=3){
REP(i,0,n){
REP(x,0,5)REP(y,0,5)if(a[i]!=x&&a[i]!=y&&x!=y)ans+=cnt[i][x]*cnt[i][y];
if(a[i]==0){
cnt2[i][0]+=cnt[i][1];
cnt2[i][1]+=cnt[i][2];
cnt2[i][2]+=cnt[i][3];
cnt2[i][3]+=cnt[i][4];
}
else if(a[i]==1){
cnt2[i][0]+=cnt[i][0];
cnt2[i][4]+=cnt[i][2];
cnt2[i][5]+=cnt[i][3];
cnt2[i][6]+=cnt[i][4];
}
else if(a[i]==2){
cnt2[i][1]+=cnt[i][0];
cnt2[i][4]+=cnt[i][1];
cnt2[i][7]+=cnt[i][3];
cnt2[i][8]+=cnt[i][4];
}
else if(a[i]==3){
cnt2[i][2]+=cnt[i][0];
cnt2[i][5]+=cnt[i][1];
cnt2[i][7]+=cnt[i][2];
cnt2[i][9]+=cnt[i][4];
}
else{
cnt2[i][3]+=cnt[i][0];
cnt2[i][6]+=cnt[i][1];
cnt2[i][8]+=cnt[i][2];
cnt2[i][9]+=cnt[i][3];
}
}
}
vector<pi> X={{0,1},{0,2},{0,3},{0,4},{1,2},{1,3},{1,4},{2,3},{2,4},{3,4}};
if(k>=4){
REP(i,0,n)for(auto u:b[i])REP(x,0,10)REP(y,0,10){
if(X[x].F!=X[y].F&&X[x].F!=X[y].S&&X[x].S!=X[y].F&&X[x].S!=X[y].S)ans+=cnt2[i][x]*cnt2[u][y];
}
}
if(k>=5){
REP(i,0,n)for(auto u:b[i])REP(j,0,10)cnt3[i][j]+=cnt2[u][j];
REP(i,0,n){
REP(x,0,10)REP(y,0,10){
if(X[x].F!=X[y].F&&X[x].F!=X[y].S&&X[x].S!=X[y].F&&X[x].S!=X[y].S&&X[x].S!=a[i]&&X[y].S!=a[i]&&X[x].F!=a[i]&&X[y].F!=a[i])ans+=cnt3[i][x]*cnt3[i][y];
}
}
}
cout<<ans;
}
# | 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... |