Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- template <int mod>
- struct ModInt {
- int val;
- int trim(int x) const { return x >= mod ? x - mod : x < 0 ? x + mod : x; }
- ModInt(int v = 0) : val(trim(v % mod)) {}
- ModInt(long long v) : val(trim(v % mod)) {}
- ModInt &operator=(int v) { return val = trim(v % mod), *this; }
- ModInt &operator=(const ModInt &oth) { return val = oth.val, *this; }
- ModInt operator+(const ModInt &oth) const { return trim(val + oth.val); }
- ModInt operator-(const ModInt &oth) const { return trim(val - oth.val); }
- ModInt operator*(const ModInt &oth) const {
- return 1LL * val * oth.val % mod;
- }
- ModInt operator/(const ModInt &oth) const {
- function<int(int, int, int, int)> modinv = [&](int a, int b, int x, int y) {
- if (b == 0) return trim(x);
- return modinv(b, a - a / b * b, y, x - a / b * y);
- };
- return *this * modinv(oth.val, mod, 1, 0);
- }
- bool operator==(const ModInt &oth) const { return val == oth.val; }
- ModInt operator-() const { return trim(mod - val); }
- template<typename T> ModInt pow(T pw) {
- bool sgn = false;
- if (pw < 0) pw = -pw, sgn = true;
- ModInt ans = 1;
- for (ModInt cur = val; pw; pw >>= 1, cur = cur * cur) {
- if (pw&1) ans = ans * cur;
- }
- return sgn ? ModInt(1) / ans : ans;
- }
- };
- template<typename T>
- vector<T> operator-(vector<T> A, vector<T> B) {
- for (int i = 0; i < A.size(); ++i) A[i] = A[i] - B[i];
- return A;
- }
- template<typename T>
- vector<T> operator*(vector<T> A, T mul) {
- for (int i = 0; i < A.size(); ++i) A[i] = A[i] * mul;
- return A;
- }
- template<typename T>
- vector<T> operator/(vector<T> A, T mul) {
- for (int i = 0; i < A.size(); ++i) A[i] = A[i] / mul;
- return A;
- }
- template<typename T>
- T det(vector<vector<T>> A) {
- int N = A.size();
- T ans{1};
- for (int r = 0; r < N; ++r) {
- if (A[r][r] == T{0}) return T{0};
- ans = ans * A[r][r];
- for (int pvt = r + 1; pvt < N; ++pvt) {
- A[pvt] = A[pvt] - A[r] * A[pvt][r] / A[r][r];
- }
- }
- return ans;
- }
- const int MOD = 998244353;
- int main() {
- ios_base::sync_with_stdio(false); cin.tie(0);
- int T; cin >> T;
- while (T--) {
- int n, m; long long k; cin >> n >> m >> k;
- int adj[50][50];
- for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) {
- adj[i][j] = i == j ? n - 1 : -1;
- }
- while (m--) {
- int u, v; cin >> u >> v;
- --u, --v;
- adj[u][v] = adj[v][u] = 0;
- --adj[u][u], --adj[v][v];
- }
- vector<vector<ModInt<MOD>>> mtx;
- if (k == 1) {
- mtx.assign(n - 1, vector<ModInt<MOD>>(n - 1));
- for (int i = 0; i < n - 1; ++i) for (int j = 0; j < n - 1; ++j) {
- mtx[i][j] = adj[i][j];
- }
- cout << det(mtx).val << '\n';
- }
- else {
- mtx.assign(n, vector<ModInt<MOD>>(n));
- for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) {
- mtx[i][j] = adj[i][j] + (i == j ? (k - 1) * n % MOD : 0);
- }
- cout << ((det(mtx)/ModInt<MOD>{(k - 1) * n % MOD}).pow(k) *
- ModInt<MOD>(1ll * n * k % MOD).pow(k - 2)).val << '\n';
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement