再来一道神题
题解传送门:https://www.byvoid.com/blog/noi-2008-design/
const int N = 100010;
struct Edge {
int V;
Edge *Next;
Edge() {}
Edge(int _V, Edge *_Next) : V(_V), Next(_Next) {}
} *Fir[N];
int Q[N], Head, Tail, Fa[N];
int n, m, Mod;
bool Vis[3][N][11];
LL Dp[3][N][11];
inline void Input() {
scanf("%d%d%d", &n, &m, &Mod);
For(i, 1, m) {
int x, y;
scanf("%d%d", &x, &y);
Fir[x] = new Edge(y, Fir[x]), Fir[y] = new Edge(x, Fir[y]);
}
}
inline void Bfs() {
clr(Fa, 0);
for(Q[Head = Tail = 1] = 1; Head <= Tail;) {
int u = Q[Head++], v;
for(Edge *Tab = Fir[u]; Tab != NULL; Tab = Tab->Next)
if(Fa[u] != (v = Tab->V)) Fa[v] = u, Q[++Tail] = v;
}
}
inline void Solve() {
if(m != n - 1) {
printf("-1\n-1\n");
return;
}
Bfs();
clr(Dp, 0), clr(Vis, 0);
Ford(j, n, 1) {
int u = Q[j], v;
Dp[0][u][0] = Vis[0][u][0] = 1;
for(Edge *Tab = Fir[u]; Tab != NULL; Tab = Tab->Next)
if((v = Tab->V) != Fa[u]) {
Dp[2][u][0] = (Dp[1][u][0] * (Dp[0][v][0] + Dp[1][v][0])) % Mod,
Vis[2][u][0] = Vis[1][u][0] & (Vis[0][v][0] | Vis[1][v][0]);
Dp[1][u][0] = (Dp[0][u][0] * (Dp[0][v][0] + Dp[1][v][0])) % Mod,
Vis[1][u][0] = Vis[0][u][0] & (Vis[0][v][0] | Vis[1][v][0]);
Dp[0][u][0] = Vis[0][u][0] = 0;
}
For(i, 1, 10) {
Vis[0][u][i] = 1, Dp[0][u][i] = 1;
for(Edge *Tab = Fir[u]; Tab != NULL; Tab = Tab->Next)
if((v = Tab->V) != Fa[u]) {
Vis[2][u][i] = (Vis[1][u][i] & (Vis[0][v][i] | Vis[1][v][i])) |
((Vis[0][v][i - 1] | Vis[1][v][i - 1] | Vis[2][v][i - 1]) & Vis[2][u][i]),
Dp[2][u][i] = (Dp[1][u][i] * (Dp[0][v][i] + Dp[1][v][i]) % Mod +
(Dp[0][v][i - 1] + Dp[1][v][i - 1] + Dp[2][v][i - 1]) % Mod * Dp[2][u][i]) % Mod;
Vis[1][u][i] = (Vis[0][u][i] & (Vis[0][v][i] | Vis[1][v][i])) |
((Vis[0][v][i - 1] | Vis[1][v][i - 1] | Vis[2][v][i - 1]) & Vis[1][u][i]),
Dp[1][u][i] = (Dp[0][u][i] * (Dp[0][v][i] + Dp[1][v][i]) % Mod +
(Dp[0][v][i - 1] + Dp[1][v][i - 1] + Dp[2][v][i - 1]) % Mod * Dp[1][u][i]) % Mod;
Vis[0][u][i] = (Vis[0][v][i - 1] | Vis[1][v][i - 1] | Vis[2][v][i - 1]) & Vis[0][u][i],
Dp[0][u][i] = (Dp[0][v][i - 1] + Dp[1][v][i - 1] + Dp[2][v][i - 1]) % Mod * Dp[0][u][i] % Mod;
}
}
}
Rep(i, 11)
if(Vis[0][1][i] || Vis[1][1][i] || Vis[2][1][i]) {
printf("%d\n%I64d\n", i, (Dp[0][1][i] + Dp[1][1][i] + Dp[2][1][i]) % Mod);
return;
}
printf("-1\n-1\n");
}
int main() {
#ifndef ONLINE_JUDGE
SETIO("1063");
#endif
Input();
Solve();
return 0;
}