提交时间:2024-11-01 14:34:10
运行 ID: 33993
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=3e5+10,base=131,mod=998244353; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } vector<int>v[maxn]; int f[maxn],jc[maxn],res=1; void dfs(int u){ f[u]=42; for(int x:v[u])dfs(x); auto cmp=[](int x,int y){ return f[x]<f[y]; }; sort(v[u].begin(),v[u].end(),cmp); int M=1; for(int x:v[u])M=M*1ll*base%mod,(f[u]+=f[x]*1ll*((f[x]+M)%mod)%mod)%=mod; up(i,0,int(v[u].size())-1){ int j=i;while(j<int(v[u].size())&&f[v[u][j]]==f[v[u][i]])++j;--j; res=res*1ll*jc[j-i+1]%mod;i=j; } } void slv(){ jc[0]=1;up(i,1,3e5)jc[i]=jc[i-1]*1ll*i%mod; int q=read(); int nd=1; bool tgA=1,tgB=1; while(q--){ int op=read(),u=read(); if(!op){ v[u].p_b(++nd); tgA&=(u==1),tgB&=(u==nd-1); } else { if(tgA){printf("%d\n",(u==1?jc[nd-1]:1));continue;} if(tgB){printf("1\n");continue;} res=1;dfs(u);printf("%d\n",res); } } } int main(){ //freopen("tree68.in","r",stdin); //freopen("tree68.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }