Loading

代码-洛谷P6657 【模板】LGV 引理

#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 mN=2e6+1,N=100;
int m,n,a[N],b[N];

//Math
const int mod=998244353;
void fmod(int &x){x+=x>>31&mod;}
int Pow(int a,int x,int res=1){
    for(;x;x>>=1,a=1ll*a*a%mod)
        (x&1)&&(res=1ll*res*a%mod);
    return res;
}
int fac[mN],ifac[mN];
void init(){
    fac[0]=1;
    R(i,mN-1) fac[i+1]=1ll*fac[i]*(i+1)%mod;
    ifac[mN-1]=Pow(fac[mN-1],mod-2);
    L(i,mN-1) ifac[i]=1ll*ifac[i+1]*(i+1)%mod;
}
int c(int a,int b){
    if(b<0||a<0||b>a) return 0;
    return 1ll*fac[a]*ifac[b]%mod*ifac[a-b]%mod;
}

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

//Main
void Main(){
    cin>>m>>n,e.clear();
    R(i,n) cin>>a[i]>>b[i];
    R(i,n)R(j,n)if(a[i]<=b[j])
        e[i][j]=c(m-1+b[j]-a[i],m-1);
    // e.print();
    cout<<e.det()<<'\n';
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    init();
    int T; for(cin>>T;T--;Main());
    return 0;
}
posted @ 2020-11-24 19:52  George1123  阅读(85)  评论(0编辑  收藏  举报