#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define int long long #define mp make_pair #define pii pair #define fi first #define se second #define pb push_back const int MOD = 998244353;// const int FACTMAX = 2000005;// const int CATALANMAX = 1000005;// int fact[FACTMAX], invfact[FACTMAX], cat[CATALANMAX]; int expo(int a, int b){ int res=1; a%=MOD; while (b){ if (b&1)res=(res*a)%MOD; a=(a*a)%MOD; b>>=1; } return res; } int inv(int num){ return expo(num, MOD-2); } void initfact(){ fact[0]=1; for (int i=1; i=0; --i)invfact[i]=(invfact[i+1]*(i+1))%MOD; } int ncr(int n, int r){ if (n>t; while (t--){ int n, m, k; cin>>n>>m>>k; vector> g(n), rg(n); vector ed; vector self(n, 0); for (int i=0; i>u>>v; --u, --v; g[u].pb(v); rg[v].pb(u); ed.pb({u, v}); if (u==v)self[u]=1; } vector vis(n, 0), reach={0}; vis[0]=1; for (int i=0; i<(int)reach.size(); ++i){ int u=reach[i]; for (int v:g[u]){ if (!vis[v]){ vis[v]=1; reach.pb(v); } } } if ((int)reach.size()!=n){ cout<<"No\n"; continue; } vector ord; fill(vis.begin(), vis.end(), 0); for (int s=0; s st; st.push({s, 0}); vis[s]=1; while (!st.empty()){ int u=st.top().fi; int &i=st.top().se; if (i<(int)g[u].size()){ int v=g[u][i++]; if (!vis[v]){ vis[v]=1; st.push({v, 0}); } } else{ ord.pb(u); st.pop(); } } } vector comp(n, -1); vector> grp; for (int i=n-1; i>=0; --i){ int s=ord[i]; if (comp[s]!=-1)continue; int id=grp.size(); grp.pb({}); stack st; st.push(s); comp[s]=id; while (!st.empty()){ int u=st.top(); st.pop(); grp[id].pb(u); for (int v:rg[u]){ if (comp[v]==-1){ comp[v]=id; st.push(v); } } } } int c=grp.size(); vector dag_ed; for (auto [u, v]:ed){ u=comp[u], v=comp[v]; if (u!=v)dag_ed.pb({u, v}); } sort(dag_ed.begin(), dag_ed.end()); dag_ed.erase(unique(dag_ed.begin(), dag_ed.end()), dag_ed.end()); vector> dag(c); vector in(c, 0); for (auto [u, v]:dag_ed){ dag[u].pb(v); ++in[v]; } queue q; for (int i=0; i top; bool ok=1; while (!q.empty()){ if ((int)q.size()>1)ok=0; int u=q.front(); q.pop(); top.pb(u); for (int v:dag[u]){ --in[v]; if (!in[v])q.push(v); } } if (!ok||top[0]!=comp[0]){ cout<<"No\n"; continue; } vector typ(c, 0), col(n, -1); for (int id=0; id qq; int s=grp[id][0]; qq.push(s); col[s]=0; bool odd=0; while (!qq.empty()&&!odd){ int u=qq.front(); qq.pop(); for (int v:g[u]){ if (comp[v]!=id)continue; int want=col[u]^1; if (col[v]==-1){ col[v]=want; qq.push(v); } else if (col[v]!=want){ odd=1; break; } } } typ[id]=(odd?1:2); } if (typ[comp[0]]!=1)ok=0; for (int i=0; i