WA 36pts
查看原帖
WA 36pts
1697870
qwqerty楼主2025/7/19 15:39
/*
Code by stringdp100005.

*/

#include <bits/stdc++.h>
#define int long long
using namespace std;

using i32 = int32_t;
using i64 = int64_t;
using ui32 = uint32_t;
using ui64 = uint64_t;

int t;

#define string int
string dp[100005];
#undef string

namespace strdp {
	void init() {

	}
	const int N = 1e5;
	vector<int> g[N + 5];
	int dfn[N + 5], low[N + 5], c, qf[N + 5], c2, w[N + 5], sz[N + 5];
	stack<int> t;
	vector<int> res[N + 5];
	bool vis[N + 5];
	void tarjan(int x) {
		dfn[x] = low[x] = ++c;
		sz[x] = 1;
		t.push(x);
		for (int i : g[x]) {
			if (!dfn[i]) {
				tarjan(i);
				low[x] = min(low[x], low[i]);
			} else if (!qf[i]) low[x] = min(low[x], dfn[i]);
		}
		if (dfn[x] == low[x]) {
			qf[x] = x;
			while (t.top() != x) {
				qf[t.top()] = x;
				++sz[x];
				t.pop();
			}
			t.pop();
		}
	}
	vector<int> g2[N + 5];
	int in[N + 5], out[N + 5], dp[N + 5], mod, dis[N + 5];
	void ts(int n) {
		queue<int> s;
		for (int i = 1; i <= n; i++) {
			if (qf[i] == i && in[i] == 0) {
				s.push(i);
				dis[i] = sz[i];
				dp[i] = 1;
			}
		}
		while (!s.empty()) {
			int u = s.front();
			s.pop();
			for (int v : g2[u]) {
				if (dis[v] < dis[u] + sz[v]) dis[v] = dis[u] + sz[v], dp[v] = dp[u];
				else if (dis[v] == dis[u] + sz[v]) dp[v] = (dp[v] + dp[u]) % mod;
				if (--in[v] == 0) {
					s.push(v);
				}
			}
		}
	}
	vector<pair<int, int>> g3, g4;
	void main(const int &cas) {
		int n, m, ans0 = 0, ans1 = 0;
		cin >> n >> m >> mod;
		for (int i = 1; i <= m; i++) {
			int u, v;
			cin >> u >> v;
			g[u].push_back(v);
			g3.push_back({u, v});
		}
		for (int i = 1; i <= n; i++) {
			if (!dfn[i]) {
				tarjan(i);
			}
		}
		for (int i = 1; i <= n; i++) vis[qf[i]] = 1;
		for (auto [i, j] : g3) {
			int u = qf[i], v = qf[j];
			if (u != v) {
				g4.push_back({u, v});
			}
		}
		sort(g4.begin(), g4.end());
		auto it = unique(g4.begin(), g4.end());
		g4.erase(it, g4.end());
		for (auto [i, j] : g4) g2[i].push_back(j);
		ts(n);
		int maxx = 0, res = 0;
		for (int i = 1; i <= n; i++) maxx = max(maxx, dis[i]);
		for (int i = 1; i <= n; i++) {
			if (maxx == dis[i]) {
				res = (res + dp[i]) % mod;
			}
		}
		cout << maxx << "\n" << res;
	}
}

// #define multipleTestCases
i32 main() {

#ifdef multipleTestCases
	cin >> t;
#else
	t = 1;
#endif

	for (int i = 1; i <= t; i++) {
		strdp::init();
		strdp::main(i);
		cout << "\n";
	}
	return 0;
}
2025/7/19 15:39
加载中...