MnZn求助
查看原帖
MnZn求助
455490
Sharpsmile楼主2022/7/6 15:31

RT,这个题卡住了,第二个样例直接就全寄了,但是看不明白哪里寄了。

做法和题解区的某解法一样,那就是把所有邻接矩阵乘起来行列式一下。不知道是我做法有锅还是写错了(求各位神仙帮帮忙哇

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <sstream>
#define mp(a,b) make_pair(a,b)
#define double long double
#define int long long
#define w(x) w[x]
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
using namespace std;
const int M=998244353;
struct MAT{
    int A[210][210];
    int n,m;
    inline void cl(){
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                A[i][j]=0;
    }
    friend MAT operator*(const MAT a,const MAT b){
        MAT c;
        c.n=a.n,c.m=b.m;
        for(int i=1;i<=c.n;i++)
            for(int j=1;j<=b.m;j++)
                for(int k=1;k<=a.m;k++)
                    c.A[i][j]=(c.A[i][j]+a.A[i][k]*b.A[k][j]%M);
        return c;
    }
};
inline int qp(int a,int x){
    int res=1;
    while(x){
        if(x&1)res=res*a%M;
        a=a*a%M;
        x>>=1;
    }
    return res;
}
inline int inv(int a){return qp(a,M-2);}
inline int det(MAT x){
    int res=1;
    int n=x.n;
    for(int i=1;i<=n;i++){
        int p=i;
        for(int j=i+1;j<=n;j++)
            if(x.A[j][i]>x.A[p][i])p=j;
        if(p!=i)res*=-1;
        for(int j=i;j<=n;j++)
            swap(x.A[i][j],x.A[p][j]);
        for(int j=i+1;j<=n;j++){
            int iv=x.A[j][i]*inv(x.A[i][i])%M;
            for(int k=i;k<=n;k++){
                x.A[j][k]-=x.A[i][k]*iv%M;
                if(x.A[j][k]<0)x.A[j][k]+=M;
            }
        }
    }
    for(int i=1;i<=n;i++)
        res=res*x.A[i][i]%M;
    return res<0?M-res:res;
}
int n[110],k,m[110];
MAT G[110];
signed main(){
    ios::sync_with_stdio(false);
    //freopen("/Users/noip2019/Downloads/xpath/xpath2.in","r",stdin);
    int t=0;
    cin>>t;
    while(t--){
        cin>>k;
        for(int i=1;i<=k;i++)
            cin>>n[i],G[i].n=G[i-1].m=n[i];
        for(int i=1;i<=k-1;i++)
            cin>>m[i];
        for(int i=1;i<=k-1;i++)
            G[i].cl();
        for(int i=1;i<=k-1;i++)
            for(int j=1;j<=m[i];j++){
                int u,v;
                cin>>u>>v;
                G[i].A[u][v]=1;
            }
        for(int i=2;i<=k-1;i++)
            G[i]=G[i-1]*G[i];
        cout<<det(G[k-1])<<endl;;
    }
    return 0;
}


2022/7/6 15:31
加载中...