Advertisement
cosminBoaca

Untitled

Apr 29th, 2015
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <cstring>
  5.  
  6. #define KMAX 105
  7. #define MOD 41143
  8.  
  9. using namespace std;
  10.  
  11. int n, k, i, j;
  12. int a[KMAX][KMAX], rez[KMAX][KMAX], aux[KMAX][KMAX];
  13.  
  14. int main()
  15. {
  16. ifstream f("pkinv.in");
  17. ofstream g("pkinv.out");
  18.  
  19. f >> n >> k;
  20.  
  21. if (!k)
  22. {
  23. g << 1;
  24. return 0;
  25. }
  26. if (n == 1)
  27. {
  28. g << 0;
  29. return 0;
  30. }
  31.  
  32. vector<int> line_prev(KMAX, 0), line_crt(KMAX, 0);
  33. vector<int> sum_prev(KMAX, 1), sum_crt(KMAX, 0);
  34. line_prev[0] = 1;
  35. for (i = 2; i <= k; ++i)
  36. {
  37. for (j = 0; j <= k; ++j)
  38. {
  39. int first = j - i + 1;
  40. if (first < 0)
  41. first = 0;
  42. line_crt[j] = sum_prev[j] - (first == 0 ? 0 : sum_prev[first - 1]);
  43. if (line_crt[j] < 0)
  44. line_crt[j] += MOD;
  45. sum_crt[j] = (j == 0 ? 0 : sum_crt[j - 1]) + line_crt[j];
  46. if (sum_crt[j] >= MOD)
  47. sum_crt[j] -= MOD;
  48. }
  49. if (n == i)
  50. {
  51. g << line_crt[k];
  52. return 0;
  53. }
  54. line_prev.swap(line_crt);
  55. sum_prev.swap(sum_crt);
  56. }
  57. for (i = 0; i <= k; ++i)
  58. {
  59. rez[i][i] = 1;
  60. for (j = i; j <= k; ++j)
  61. a[i][j] = 1;
  62. }
  63. int pow = n - k;
  64. for (int b = 0; b <= 30; ++b)
  65. {
  66. if (pow & (1 << b))
  67. {
  68. memset(aux, 0, KMAX * KMAX * sizeof(int));
  69. for (i = 0; i <= k; ++i)
  70. for (j = 0; j <= k; ++j)
  71. for (int t = 0; t <= k; ++t)
  72. aux[i][j] = (aux[i][j] + rez[i][t] * a[t][j]) % MOD;
  73. for (i = 0; i <= k; ++i)
  74. for (j = 0; j <= k; ++j)
  75. rez[i][j] = aux[i][j];
  76. }
  77. memset(aux, 0, KMAX * KMAX * sizeof(int));
  78. for (i = 0; i <= k; ++i)
  79. for (j = 0; j <= k; ++j)
  80. for (int t = 0; t <= k; ++t)
  81. aux[i][j] = (aux[i][j] + a[i][t] * a[t][j]) % MOD;
  82. for (i = 0; i <= k; ++i)
  83. for (j = 0; j <= k; ++j)
  84. a[i][j] = aux[i][j];
  85. }
  86. int sol = 0;
  87. for (i = 0; i <= k; ++i)
  88. sol = (sol + line_prev[i] * rez[i][k]) % MOD;
  89. g << sol;
  90. return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement