結果
| 問題 | No.1907 DETERMINATION |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-04-15 22:55:19 |
| 言語 | C++17(clang) (17.0.6 + boost 1.89.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 4,004 bytes |
| 記録 | |
| コンパイル時間 | 3,077 ms |
| コンパイル使用メモリ | 167,168 KB |
| 実行使用メモリ | 16,444 KB |
| 最終ジャッジ日時 | 2024-12-25 02:08:14 |
| 合計ジャッジ時間 | 235,486 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 20 TLE * 43 |
ソースコード
#include "bits/stdc++.h"
using namespace std;
#define all(x) begin(x),end(x)
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
template<typename T_container, typename T = typename enable_if<!is_same<T_container, string>::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { string sep; for (const T &x : v) os << sep << x, sep = " "; return os; }
#define debug(a) cerr << "(" << #a << ": " << a << ")\n";
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int,int> pi;
const int mxN = 1e5+1, oo = 1e9;
const ll mod = 998244353;
#define rep(i,a,b) for(int i=a;i<b;++i)
const long long MD = 998244353;
template<long long MOD=MD> struct mdint {
int d=0;
mdint () {d=0;}
mdint (long long _d) : d(_d%MOD){
if(d<0) d+=MOD;
};
friend mdint& operator+=(mdint& a, const mdint& o) {
a.d+=o.d; if(a.d>=MOD) a.d-=MOD;
return a;
}
friend mdint& operator-=(mdint& a, const mdint& o) {
a.d-=o.d; if(a.d<0) a.d+=MOD;
return a;
}
friend mdint& operator*=(mdint& a, const mdint& o) {
return a = mdint((ll)a.d*o.d);
}
mdint operator*(const mdint& o) const {
mdint res = *this;
res*=o;
return res;
}
mdint operator+(const mdint& o) const {
mdint res = *this;
res+=o;
return res;
}
mdint operator-(const mdint& o) const {
mdint res = *this;
res-=o;
return res;
}
mdint operator^(long long b) const {
mdint tmp = 1;
mdint power = *this;
while(b) {
if(b&1) {
tmp = tmp*power;
}
power = power*power;
b/=2;
}
return tmp;
}
friend mdint operator/=(mdint& a, const mdint& o) {
a *= (o^(MOD-2));
return a;
}
mdint operator/(const mdint& o) {
mdint res = *this;
res/=o;
return res;
}
bool operator==(const mdint& o) { return d==o.d;}
bool operator!=(const mdint& o) { return d!=o.d;}
friend istream& operator>>(istream& c, mdint& a) {return c >> a.d;}
friend ostream& operator<<(ostream& c, const mdint& a) {return c << a.d;}
};
using mint = mdint<MD>;
ll det(vector<vector<ll>>& a) {
int n = a.size(); ll ans = 1;
rep(i,0,n) {
rep(j,i+1,n) {
while (a[j][i] != 0) { // gcd step
ll t = a[i][i] / a[j][i];
if (t) rep(k,i,n)
a[i][k] = (a[i][k] - a[j][k] * t) % mod;
swap(a[i], a[j]);
ans *= -1;
}
}
ans = ans * a[i][i] % mod;
if (!ans) return 0;
}
return (ans + mod) % mod;
}
int main() {
// calculate reduced form and multiply
// need polynomials
int n; cin >> n;
vvi a(n,vi(n));
for(auto& r : a) for(auto& i : r) cin >> i;
vvi b(n,vi(n));
for(auto& r : b) for(auto& i : r) cin >> i;
vector<int> dets;
for(int x=0;x<=n;++x) {
vector<vector<ll>> ab(n,vector<ll>(n));
for(int i=0;i<n;++i) for(int j=0;j<n;++j) ab[i][j]=(a[i][j]+b[i][j]*ll(x))%mod;
dets.push_back(det(ab));
}
vector<mint> res(n+1);
for(int i=0;i<=n;++i) {
vector<vector<mint>> pols;
auto mul = [&pols](auto self, int l, int r) {
if(l==r) return pols[l];
int mid = (l+r)/2;
auto c = self(self,l,mid), d = self(self,mid+1,r);
vector<mint> res(c.size()+d.size()-1);
for(int i=0;i<c.size();++i) for(int j=0;j<d.size();++j) {
res[i+j]+=c[i]*d[j];
}
return res;
};
mint denum=1;
for(int j=0;j<=n;++j) if(i!=j) {
pols.push_back(vector<mint>{-j,1});
denum*=i-j;
}
auto mypol = mul(mul,0,n-1);
for(int j=0;j<mypol.size();++j) {
res[j]+=mypol[j]*dets[i]/denum;
}
}
for(auto i : res) cout << i << '\n';
}