1. 程式人生 > 實用技巧 >2020牛客多校第一場D

2020牛客多校第一場D

思路:

最後推出公式,發現只要用高斯消元求出矩陣A的逆即可

Code:

#pragma GCC optimize(3)
#pragma GCC optimize(2)
#include <map>
#include <set>
#include <array>
#include <queue>
#include <stack>
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include 
<sstream> #include <iostream> #include <stdlib.h> #include <algorithm> #include <unordered_map> using namespace std; typedef long long ll; typedef pair<int, int> PII; #define Time (double)clock() / CLOCKS_PER_SEC #define sd(a) scanf("%d", &a) #define sdd(a, b) scanf("%d%d", &a, &b) #define
slld(a) scanf("%lld", &a) #define slldd(a, b) scanf("%lld%lld", &a, &b) const int N = 200 + 10; const ll M = 4e12; const int mod = 998244353; int n; ll a[N][N], b[N], p[N][N]; ll ans = 0; ll qmi(ll a, ll b, ll p){ ll res = 1; while(b){ if(b & 1) res = res * a % p; a
= a * a % p; b >>= 1; } return res; } void gauss() { int c, r; for (c = 0, r = 0; c < n; c ++ ) { int t = r; for (int i = r; i < n; i ++ ) if (a[i][c] > 0){ t = i; break; } if (a[t][c] == 0) return; for (int i = 0; i < n; i ++) { swap(a[t][i], a[r][i]); swap(p[t][i], p[r][i]); } ll k = qmi(a[r][r], mod - 2, mod); for(int i = 0; i < n; i ++){ a[r][i] = k * a[r][i] % mod; p[r][i] = k * p[r][i] % mod; } for (int i = 0; i < n; i ++){ if(i == r) continue; if (a[i][c] != 0){ k = a[i][c]; for (int j = 0; j < n; j ++){ a[i][j] = (a[i][j] - a[r][j] * k % mod + mod) % mod; p[i][j] = (p[i][j] - p[r][j] * k % mod + mod) % mod;; } } } r ++ ; } } int main() { #ifdef ONLINE_JUDGE #else freopen("/home/jungu/code/in.txt", "r", stdin); freopen("/home/jungu/code/out.txt", "w", stdout); // freopen("/home/jungu/code/out.txt","w",stdout); #endif // ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); while(~sd(n)){ memset(p, 0, sizeof(p)); for(int i = 0; i < n; i ++){ p[i][i] = 1; } for(int i = 0; i < n; i ++){ for(int j = 0; j < n; j ++){ slld(a[i][j]); a[i][j] = (a[i][j] % mod + mod) % mod; } } for(int i = 0; i < n; i ++){ slld(b[i]); b[i] = (b[i] % mod + mod) % mod; } gauss(); ans = 0; for(int i = 0; i < n; i ++){ for(int j = 0; j < n; j ++){ ans = (ans + b[j] * p[j][i] % mod * b[i] % mod) % mod; } } cout << ans << endl; } return 0; }