結果

問題 No.2255 Determinant Sum
ユーザー pockynypockyny
提出日時 2023-03-29 06:46:00
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 3,354 bytes
コンパイル時間 1,244 ms
コンパイル使用メモリ 89,752 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-09-21 00:44:20
合計ジャッジ時間 3,548 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 AC 28 ms
5,376 KB
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 AC 21 ms
5,376 KB
testcase_11 AC 8 ms
5,376 KB
testcase_12 WA -
testcase_13 AC 11 ms
5,376 KB
testcase_14 AC 226 ms
5,376 KB
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
権限があれば一括ダウンロードができます

ソースコード

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 inve(ll x){return x;}
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;
            ll x = (a[j][i]*inve(a[j][i]))&1;
            for(k=0;k<n;k++){
                (a[j][k] += mod - (a[i][k]*x)&1) &= 1;
                // (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;
    for(i=0;i<n;i++) ret *= a[i][i];
    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]*pref_sum[i]%mod*suff_sum[i + 1]%mod*fi[i]%mod*fi[d - 1 - i]%mod;
        // ll x = v[i]*fi[i]%mod*fi[d - 1 - i]%mod;
        // ll x = (v[i]*fi[i]*fi[d - 1 - i])&1;
        // cout << v[i] << " " << fi[i] << " " << fi[d - 1 - i] << endl;
        // if(s>0) (ans += x) %= mod; 
        // else (ans += mod - x) %= mod;
        // s *= -1;
        (ans += v[i]) &= 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;
        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];
        }
        if(mod!=2){
            cout << 0 << "\n";
        }else{
            solve();
            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);
            cout << interpolation(f,val) << "\n";
            // for(i=0;i<n;i++) cout  << f[i] << " ";
            // cout << "\n";
        }
    }
}
0