fork download
  1. //Lib
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<ctime>
  7.  
  8. #include<iostream>
  9. #include<algorithm>
  10. #include<vector>
  11. #include<string>
  12. #include<queue>
  13. //#include<stack>
  14. #include<set>
  15. #include<map>
  16. using namespace std;
  17. //Macro
  18. #define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i)
  19. #define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i)
  20. #define erep(i,e,x) for(int i=x;i;i=e[i].next)
  21. #define irep(i,x) for(set<int>::iterator i=x.begin();i!=x.end();i++)
  22. #define read() (strtol(ipos,&ipos,10))
  23. #define sqr(x) ((x)*(x))
  24. #define pb push_back
  25. #define PS system("pause");
  26. typedef long long ll;
  27. typedef pair<int,int> pii;
  28. const int oo=~0U>>1;
  29. const double inf=1e100;
  30. const double eps=1e-6;
  31. string name="", in=".in", out=".out";
  32. //Var
  33. struct S
  34. {
  35. int size,sum;
  36. S():size(0),sum(1){}
  37. }f[100008],ans;
  38. struct E
  39. {
  40. int next,node;
  41. }e[1000008];
  42. int n,m,mod,tot;
  43. int stack[100008],dfn[100008],low[100008],top,idx,cnt;
  44. int belong[100008],ind[100008],size[100008],h[100008];
  45. bool vis[100008];
  46. set<int> E[100008];
  47. queue<int> q;
  48. vector<int> vec;
  49. void add(int a,int b){e[++tot].next=h[a];e[tot].node=b;h[a]=tot;}
  50. void Update(S &a,S &b)
  51. {
  52. if(a.size>b.size)return;
  53. if(a.size<b.size){a=b;return;}
  54. a.sum=(a.sum+b.sum)%mod;
  55. }
  56. void DFS(int u)
  57. {
  58. dfn[u]=low[u]=++idx;
  59. stack[++top]=u;vis[u]=true;
  60. int v;
  61. erep(i,e,h[u])
  62. {
  63. if(!dfn[v=e[i].node])
  64. {
  65. DFS(v);
  66. low[u]=min(low[u],low[v]);
  67. }
  68. else if(vis[v]) low[u]=min(low[u],dfn[v]);
  69. }
  70. if(low[u]==dfn[u])
  71. {
  72. ++cnt;
  73. do
  74. {
  75. belong[v=stack[top--]]=cnt;
  76. vis[v]=false;
  77. }while(u!=v);
  78. }
  79. }
  80. void Tarjan()
  81. {
  82. rep(i,1,n)if(!dfn[i])DFS(i);
  83. rep(i,1,n)
  84. {
  85. int id=belong[i];size[id]++;
  86. erep(x,e,h[i])if(belong[e[x].node]!=id)E[id].insert(belong[e[x].node]);
  87. }
  88. }
  89. void Work()
  90. {
  91. int u,v;
  92. scanf("%d%d%d",&n,&m,&mod);
  93. rep(i,1,m)scanf("%d%d",&u,&v),add(u,v);
  94. Tarjan();
  95. rep(i,1,cnt)
  96. irep(it,E[i])
  97. ind[*it]++;
  98. rep(i,1,cnt)if(!ind[i])q.push(i);
  99. while(!q.empty())
  100. {
  101. u=q.front();q.pop();vec.pb(u);
  102. irep(i,E[u])
  103. if(!(--ind[*i]))
  104. q.push(*i);
  105. }
  106. for(vector<int>::reverse_iterator i=vec.rbegin();i!=vec.rend();i++)
  107. {
  108. irep(it,E[*i])
  109. Update(f[*i],f[*it]);
  110. f[*i].size=(f[*i].size+size[*i])%mod;
  111. }
  112. rep(i,1,cnt)Update(ans,f[i]);
  113. printf("%d\n%d\n",ans.size,ans.sum);
  114. }
  115. int main()
  116. {
  117. // freopen((name+in).c_str(),"r",stdin);
  118. // freopen((name+out).c_str(),"w",stdout);
  119. // Init();
  120. Work();
  121. return 0;
  122. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty