Water, water, last ans don't forget% oh!
#include <cstdio> #include <cstring> #include <algorithm>using namespace std;const int mo = 45989;int CNT = 1, point[23], N, M, T, S, t;struct node {int u, V, NXT;} e[1003];struct Mt {int v[123][123]; Mt () {memset (V, 0, sizeof (v));} Friend Mt operator * (Mt A, MT B) {MT ans;for (int i = 1; I <= cnt; ++i) for (int j = 1; j <= cnt; ++j) for (int k = 1; k <= CNT; ++k) ans.v[i][j]= (Ans.v[i][j] + a.v[i][k] * b.v[k][j])% mo;return ans; Friend Mt operator ^ (Mt A, int b) {MT ans;for (int i = 1; I <= cnt; ++i) Ans.v[i][i] = 1;for (int i = b; i; I >>= 1 , a = a * a) if (I & 1) ans = ans * a;return ans;}} A, b;inline void ins (int x, int y) {e[++cnt].u = x; E[CNT].V = y; E[CNT].NXT = Point[x]; POINT[X] = cnt;} int main () {scanf ("%d%d%d%d%d", &n, &m, &t, &s, &t); int u, v;for (int i = 1; I <= m; ++i) {scanf ("%d %d ", &u, &v); Ins (U, v); Ins (v, u);} for (int tmp = Point[s]; TMP, TMP = E[TMP].NXT) ++a.v[1][tmp];for (int i = 2; I <= cnt; ++i) for (int j = 2; J <= CNT; ++J) if (e[i].v = = E[j].u && I! = (j ^ 1)) ++b.v[i][j]; A = A * (B ^ (t-1)); int ans = 0;for (int tmp = point[t]; tmp; tmp = e[tmp].nxt) ans + = a.v[1][tmp ^ 1];p rintf ("%d\n", ans % mo); return 0;}
Hhh
"Bzoj 1875" "Sdoi 2009" HH Go for a walk