結果

問題 No.2255 Determinant Sum
ユーザー pockyny
提出日時 2023-03-29 06:26:17
言語 C++17(gcc12)
(gcc 12.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 3,107 bytes
コンパイル時間 4,762 ms
コンパイル使用メモリ 114,104 KB
最終ジャッジ日時 2025-02-11 18:58:04
ジャッジサーバーID
(参考情報)
judge3 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 4 WA * 13 RE * 1 TLE * 5
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
ll mod;
ll pw(ll a,ll x){
ll ret = 1;
while(x){
if(x&1) (ret *= a) %= mod;
(a *= a) %= mod; x /= 2;
}
return ret;
}
ll inve(ll x){return pw(x,mod - 2);}
ll det(vector<vector<ll>> a){
int i,j,k,n = a.size();
ll ret = 1;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(a[i][j]<0) a[i][j] += mod;
if(a[i][j]>=mod) (a[i][j]) %= mod;
}
}
for(i=0;i<n;i++){
int piv = -1;
for(j=i;j<n;j++){
if(a[j][i]!=0){
piv = j;
break;
}
}
if(piv==-1) break;
swap(a[piv],a[i]);
if(piv!=i) ret *= -1;
for(j=i + 1;j<n;j++){
ll x = a[j][i]*inve(a[i][i])%mod;
for(k=0;k<n;k++){
(a[j][k] += mod - a[i][k]*x%mod) %= mod;
}
}
}
if(ret<0) ret += mod;
for(i=0;i<n;i++) (ret *= a[i][i]) %= mod;
return ret;
}
const int MX = 110;
ll f[MX],inv[MX],fi[MX];
void solve(){
inv[1] = 1;
for(int i=2;i<MX;i++){
inv[i] = mod - (mod/i)*inv[mod%i]%mod;
}
f[0] = fi[0] = 1;
for(int i=1;i<MX;i++){
f[i] = f[i-1]*i%mod;
fi[i] = fi[i-1]*inv[i]%mod;
}
}
ll nck(ll n, ll k){
if(n<0 || k<0 || n<k) return 0;
return f[n]*fi[k]%mod*fi[n-k]%mod;
}
ll interpolation(vector<ll> &v,ll N){
//given v[0] = f(z),v[1] = f(z + 1),...v[d - 1] = f(z + d - 1)
// output f(N)
const int z = 0; //
int d = v.size();
vector<ll> pref_sum(d + 1),suff_sum(d + 1); //
pref_sum[0] = suff_sum[d] = 1;
for(int i=1;i<=d;i++) pref_sum[i] = (N + 2*mod - z - i + 1)%mod*pref_sum[i - 1]%mod;
for(int i=d - 1;i>=0;i--) suff_sum[i] = (N + 2*mod - z - i)%mod*suff_sum[i + 1]%mod;
ll ans = 0; ll s = 1;
for(int i=d - 1;i>=0;i--){
ll x = v[i]*fi[i]%mod*fi[d - 1 - i]%mod;
if(s>0) (ans += x) %= mod;
else (ans += mod - x) %= mod;
s *= -1;
}
return ans;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t; cin >> t;
while(t){
t--;
int i,j,n; cin >> n >> mod;
if(mod!=2){
cout << 0 << "\n";
}else{
solve();
vector<vector<ll>> a(n),b(n);
for(i=0;i<n;i++){
a[i].resize(n); b[i].resize(n);
for(j=0;j<n;j++) cin >> a[i][j];
}
vector<ll> f(n);
for(int k=0;k<n;k++){
for(i=0;i<n;i++) b[i] = a[i];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(b[i][j]==-1) b[i][j] = k;
}
}
f[k] = det(b);
}
ll val = (mod - 1)*inve(2)%mod;
cout << interpolation(f,val) << "\n";
// for(i=0;i<n;i++) cout << f[i] << " ";
// cout << "\n";
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0