1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include <cstdio> #include <iostream> using namespace std; typedef long long L; const int N = 60; int p; struct Matrix { int n, m, w[N][N]; Matrix (int x, int y, int k) { n = x, m = y; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) w[i][j] = i == j ? k : 0; } friend Matrix operator* (Matrix x, Matrix y) { Matrix res(x.n, y.m, 0); for (int i = 0; i < res.n; ++i) for (int j = 0; j < res.m; ++j) for (int k = 0; k < x.m; ++k) res.w[i][j] = (res.w[i][j] + (L)x.w[i][k] * y.w[k][j]) % p; return res; } friend Matrix operator^ (Matrix b, L k) { Matrix res(b.n, b.m, 1); for (; k; k >>= 1, b = b * b) if (k & 1) res = res * b; return res; } }; int main () { int n, k, r; cin >> n >> p >> k >> r; Matrix A(1, k, 0), B(k, k, 0); A.w[0][0] = 1; for (int i = 0; i < k; ++i) ++B.w[i][i], ++B.w[i][(i + 1) % k]; cout << (A * (B ^ (L)n * k)).w[0][r]; return 0; }
|