#include <bits/stdc++.h> #define x first #define y second #define int long long using namespace std; const int N = 4e5, M = 1e9 + 7; int n, m, cnt; int flg[N + 5]; vector<int> G[N + 5], D[N + 5]; void gm(int &x) { while(x >= M) x -= M; while(x < 0) x += M; return; } int get_r3() { int ret = 0; for(int x = 1; x <= n; x ++) { for(auto y : D[x]) { flg[y] = 1; } for(auto y : D[x]) { for(auto z : D[y]) if(flg[z]) { ret += (G[x].size() - 2) + (G[y].size() - 2) + (G[z].size() - 2); ret ++; gm(ret); } } for(auto y : D[x]) { flg[y] = 0; } } //~ cout << "R3 " << ret << '\n'; return ret; } int get_r4() { int ret = 0; for(int x = 1; x <= n; x ++) { for(auto y : G[x]) { for(auto z : D[y]) if(G[z].size() * n + z > G[x].size() * n + x) { ret += flg[z]; flg[z] ++; gm(ret); } } for(auto y : G[x]) { for(auto z : D[y]) if(G[z].size() * n + z > G[x].size() * n + x) { flg[z] = 0; } } } return ret; } int deal() { int ret = 0; for(int x = 1; x <= n; x ++) { int ny = 0; for(auto y : G[x]) { ret += (G[y].size() - 1) * ny % M; ny += G[y].size() - 1; gm(ret); gm(ny); } } for(int x = 1; x <= n; x ++) { int ny = (G[x].size() - 1) * (G[x].size() - 2) / 2 % M; for(auto y : G[x]) { ret += (G[y].size() - 1) * ny % M; gm(ret); } } for(int x = 1; x <= n; x ++) { __int128 y = G[x].size(); ret += y * (y - 1) * (y - 2) * (y - 3) / 4 / 3 / 2 % M; gm(ret); } return ret; } signed main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); //~ freopen("19.in", "r", stdin); int t; cin >> t; while(t --) { cin >> n >> m; for(int i = 1; i <= n; i ++) G[i].clear(), D[i].clear(); for(int i = 1; i <= m; i ++) { int x, y; cin >> x >> y; G[x].push_back(y); G[y].push_back(x); } for(int i = 1; i <= n; i ++) { for(auto x : G[i]) if(G[x].size() * n + x > G[i].size() * n + i) D[i].push_back(x); } int ans = deal() - get_r4() * 3 % M - get_r3() * 3 % M; gm(ans); cout << ans << '\n'; } return 0; }
Note.ms
/eee