85pts re求调
查看原帖
85pts re求调
554698
Zi_Gao楼主2023/9/18 22:00
#include<bits/stdc++.h>
#define int long long
// #define ONLINE_JUDGE
#define INPUT_DATA_TYPE long long
#define OUTPUT_DATA_TYPE long long
INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){register char s[20];register int i=0;if(x<0){x=-x;putchar('-');}if(x==0){putchar('0');return;}while(x){s[i++]=x%10;x/=10;}while(i){putchar(s[--i]+'0');}return;}

int par[3000010],siz[3000010];
long long ans[3000010],invfact[3000010],fact[3000010];
const long long mod=1000000007;

long long C(int n,int m){return fact[n]*invfact[n-m]%mod*invfact[m]%mod;}

long long qpow(register long long base,register long long e){
    register long long res=1;
    while(e){
        if(e&1) (res*=base)%=mod;
        (base*=base)%=mod;
        e>>=1;
    }
    return res;
}

void build(int n){
    register int i;
    for(i=0;i<n;++i) par[i]=i,siz[i]=ans[i]=1;
    return;
}
int find(int x){return x==par[x]?x:(par[x]=find(par[x]));}
void merge(int u,int v){
    u=find(u),v=find(v);
    siz[v]+=siz[u];
    ans[v]=ans[u]*ans[v]%mod*C(siz[v]-1,siz[u])%mod;
    par[u]=v;
    return;
}

signed main(){
	#ifndef ONLINE_JUDGE
	freopen("name.in", "r", stdin);
	freopen("name.out", "w", stdout);
	#endif

    register int i,op,u,v;
    register long long latans=0;
    int n=read();
    build(n);

    fact[0]=fact[1]=invfact[0]=invfact[1]=1;
    for(i=2;i<=n;++i) fact[i]=fact[i-1]*i%mod;
    invfact[n]=qpow(fact[n],mod-2);
    for(i=n-1;i>1;--i) invfact[i]=invfact[i+1]*(i+1)%mod;

    int q=read();

    for(i=0;i<q;++i){
        op=read();
        if(op==1){
            u=((read()+latans)%mod)%n;
            v=((read()+latans)%mod)%n;
            merge(u,v);
        }else{
            u=((read()+latans)%mod)%n;
            latans=ans[find(u)]+mod;
            latans%=mod;
            latans+=mod;
            latans%=mod;
            print(latans);
            putchar('\n');
        }
    }

	#ifndef ONLINE_JUDGE
	fclose(stdin);
	fclose(stdout);
	#endif
    return 0;
}
2023/9/18 22:00
加载中...