Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <cstring>
- #define KMAX 105
- #define MOD 41143
- using namespace std;
- int n, k, i, j;
- int a[KMAX][KMAX], rez[KMAX][KMAX], aux[KMAX][KMAX];
- int main()
- {
- ifstream f("pkinv.in");
- ofstream g("pkinv.out");
- f >> n >> k;
- if (!k)
- {
- g << 1;
- return 0;
- }
- if (n == 1)
- {
- g << 0;
- return 0;
- }
- vector<int> line_prev(KMAX, 0), line_crt(KMAX, 0);
- vector<int> sum_prev(KMAX, 1), sum_crt(KMAX, 0);
- line_prev[0] = 1;
- for (i = 2; i <= k; ++i)
- {
- for (j = 0; j <= k; ++j)
- {
- int first = j - i + 1;
- if (first < 0)
- first = 0;
- line_crt[j] = sum_prev[j] - (first == 0 ? 0 : sum_prev[first - 1]);
- if (line_crt[j] < 0)
- line_crt[j] += MOD;
- sum_crt[j] = (j == 0 ? 0 : sum_crt[j - 1]) + line_crt[j];
- if (sum_crt[j] >= MOD)
- sum_crt[j] -= MOD;
- }
- if (n == i)
- {
- g << line_crt[k];
- return 0;
- }
- line_prev.swap(line_crt);
- sum_prev.swap(sum_crt);
- }
- for (i = 0; i <= k; ++i)
- {
- rez[i][i] = 1;
- for (j = i; j <= k; ++j)
- a[i][j] = 1;
- }
- int pow = n - k;
- for (int b = 0; b <= 30; ++b)
- {
- if (pow & (1 << b))
- {
- memset(aux, 0, KMAX * KMAX * sizeof(int));
- for (i = 0; i <= k; ++i)
- for (j = 0; j <= k; ++j)
- for (int t = 0; t <= k; ++t)
- aux[i][j] = (aux[i][j] + rez[i][t] * a[t][j]) % MOD;
- for (i = 0; i <= k; ++i)
- for (j = 0; j <= k; ++j)
- rez[i][j] = aux[i][j];
- }
- memset(aux, 0, KMAX * KMAX * sizeof(int));
- for (i = 0; i <= k; ++i)
- for (j = 0; j <= k; ++j)
- for (int t = 0; t <= k; ++t)
- aux[i][j] = (aux[i][j] + a[i][t] * a[t][j]) % MOD;
- for (i = 0; i <= k; ++i)
- for (j = 0; j <= k; ++j)
- a[i][j] = aux[i][j];
- }
- int sol = 0;
- for (i = 0; i <= k; ++i)
- sol = (sol + line_prev[i] * rez[i][k]) % MOD;
- g << sol;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement