求赞!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+10;
set<ll> S;
stack<ll> s;
vector<ll> e1[N],e2[N];
ll n,m,x,t,cnt,k,c,dfn[N],low[N],scc[N],w[N],f[N],g[N];
bool st[N];
void tarjan(ll u) {
dfn[u]=low[u]=++t;
s.push(u),st[u]=1;
for(ll v:e1[u])
if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
else if(st[v]) low[u]=min(low[u],dfn[v]);
if(dfn[u]==low[u]) {
++cnt;
ll v;
do {
v=s.top();
s.pop(),st[v]=0,scc[v]=cnt,++w[cnt];
} while(u!=v);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>x;
for(ll i=1,a,b; i<=m; ++i) cin>>a>>b,e1[a].push_back(b);
for(ll i=1; i<=n; ++i) if(!dfn[i]) tarjan(i);
for(ll u=1; u<=n; ++u)
for(ll v:e1[u]) {
ll a=scc[u],b=scc[v],h=a*1e6+b;
if(a!=b && !S.count(h)) {
e2[a].push_back(b);
S.insert(h);
}
}
for(ll u=cnt; u; --u) {
if(!f[u]) f[u]=w[u],g[u]=1;
for(ll v:e2[u])
if(f[u]+w[v]>f[v]) f[v]=f[u]+w[v],g[v]=g[u];
else if(f[u]+w[v]==f[v]) g[v]=(g[v]+g[u])%x;
}
for(ll i=1; i<=cnt; ++i)
if(f[i]>k) k=f[i],c=g[i];
else if(f[i]==k) c=(c+g[i])%x;
cout<<k<<"\n"<<c;
return 0;
}