Loading

代码-CF167E Wizards and Bets

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);~i;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;

//Data
const int N=600;
int n,m,mod,f[N][N];
vector<int> as,bs;

//Math
void fmod(int &x){x+=x>>31&mod;}

//Matrix
struct Matrix{
    int mn,a[N][N];
    void print(){
        cout<<"Matrix "<<mn<<"\n";
        R(i,mn)R(j,mn) cout<<a[i][j]<<" \n"[mn-j==1];
    }
    int* operator[](int i){return a[i];}
    int det(int res=1,int j=-1){
        R(i,mn){
            for(j=i;j<mn;j++)if(a[j][i]) break;
            if(j==mn) return 0;
            if(i!=j) swap(a[i],a[j]),res=-res;
            for(j=i+1;j<mn;j++)while(a[j][i]){
                int d=a[j][i]/a[i][i];
                for(int t=i;t<mn;t++) fmod(a[j][t]-=1ll*a[i][t]*d%mod);
                if(!a[j][i]) break; swap(a[i],a[j]),res=-res;
            }
        }
        fmod(res);
        R(i,mn) res=1ll*res*a[i][i]%mod;
        return res;
    }
}mat;

//Graph
vector<int> e[N];
int ind[N],oud[N];
queue<int> q;
void toposort(){
    R(u,n)if(!ind[u]) q.push(u);
    while(sz(q)){
        int u=q.front(); q.pop();
        for(int v:e[u]){
            R(i,mat.mn) fmod(f[i][v]+=f[i][u]-mod);
            if(!--ind[v]) q.push(v);
        }
    }
}

//Main
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m>>mod;
    R(i,m){
        int u,v;
        cin>>u>>v,--u,--v;
        ind[v]++,oud[u]++;
        e[u].pb(v);
    }
    R(u,n)if(!ind[u]) as.pb(u);
    R(u,n)if(!oud[u]) bs.pb(u);
    mat.mn=sz(as),assert(mat.mn==sz(bs));
    R(i,mat.mn) f[i][as[i]]=1;
    toposort();
    R(i,mat.mn)R(j,mat.mn) mat[i][j]=f[i][bs[j]];
    // mat.print();
    cout<<mat.det()<<'\n';
    return 0;
}
posted @ 2020-11-24 20:40  George1123  阅读(37)  评论(0编辑  收藏  举报