Logo syxx_zhuyile的博客

博客

#2418. [COCI 2023/2024 #4] Lepeze

2026-07-15 10:38:25 By syxx_zhuyile

By @AFewSuns

#include<bits/stdc++.h>
using namespace std;
using namespace my_std;
#define mod 1000000007
ll n,q,jc[200020],jcinv[200020],invv[200020],sum[200020],tree[200020];
il ll lowbit(ll x){
    return x&(-x);
}
il void mdf(ll x,ll v){
    if(v<0) v=-v;
    else v=invv[v];
    while(x<=n){
        tree[x]=tree[x]*v%mod;
        x+=lowbit(x);
    }
}
il ll query(ll x){
    ll res=1;
    while(x){
        res=res*tree[x]%mod;
        x-=lowbit(x);
    }
    return res;
}
il void solve(ll x,ll y,ll t){
    sum[x]-=t;
    ll len=(y-x+n)%n-1;
    swap(x,y);
    x=x%n+1;
    y=(y+n-2)%n+1;
    if(x<=y){
        mdf(x,t*len);
        mdf(y+1,-t*len);
    }
    else{
        mdf(x,t*len);
        mdf(1,t*len);
        mdf(y+1,-t*len);
    }
}
int main(){
    n=read();
    q=read();
    jc[0]=1;
    fr(i,1,n) jc[i]=jc[i-1]*i%mod;
    jcinv[n]=inv(jc[n],mod);
    pfr(i,n-1,0) jcinv[i]=jcinv[i+1]*(i+1)%mod;
    fr(i,1,n) invv[i]=jcinv[i]*jc[i-1]%mod;
    fr(i,1,n) sum[i]=n-3;
    fr(i,1,n) tree[i]=1;
    fr(i,1,n-3){
        ll x=read(),y=read();
        solve(x,y,1);
        solve(y,x,1);
    }
    while(q--){
        ll opt=read();
        if(opt==1){
            ll x=read(),y=read(),xx=read(),yy=read();
            solve(x,y,-1);
            solve(y,x,-1);
            solve(xx,yy,1);
            solve(yy,xx,1);
        }
        else{
            ll x=read();
            pf("%lld %lld\n",sum[x],jc[sum[x]]*query(x)%mod);
        }
    }
}

评论

暂无评论