Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define maxN 102
  3. #define maxM 1000000000
  4. #define mod 1000000009
  5.  
  6. using namespace std;
  7.  
  8. FILE *fin = freopen("alternant.in", "r", stdin);
  9. FILE *fout = freopen("alternant.out", "w", stdout);
  10.  
  11. int dp[2][maxN], v[maxN];
  12.  
  13. int T[maxN][maxN], Ans[maxN][maxN];
  14. int lgPow(int a, int b)
  15. {
  16. int ret = 1;
  17. for (int i = 0; (1 << i) <= b; ++ i, a = (1LL * a * a) % mod)
  18. if (b & (1 << i))
  19. ret = (1LL * ret * a) % mod;
  20. return ret;
  21. }
  22. void mul(int n, int a[maxN][maxN], int b[maxN][maxN])
  23. {
  24. int res[maxN][maxN];
  25. for (int i = 0; i < n; ++ i)
  26. for (int j = 0; j < n; ++ j)
  27. {
  28. res[i][j] = 0;
  29. for (int k = 0; k < n; ++ k)
  30. res[i][j] = (1LL * res[i][j] + 1LL * a[i][k] * b[k][j]) % mod;
  31. }
  32. memcpy(a, res, sizeof(res));
  33. }
  34.  
  35. void printProb(const int &n, const int &m, const int &A, const int &B)
  36. {
  37. int pos = 0;
  38. for (int i = 0; i < n; i += 2)
  39. {
  40. if (v[i] == 0)
  41. ++ pos;
  42. }
  43. for (int i = 0; (1 << i) <= m; ++ i, mul(n, T, T))
  44. if (m & (1 << i))
  45. mul(n, Ans, T);
  46.  
  47. int ans = lgPow(n * n, mod - 1 - m);
  48. ans = (1LL * ans * Ans[pos][A]) % mod;
  49. printf("%d\n", ans);
  50. }
  51. void computeMat(const int &n, const int &m, const int &A, const int &B)
  52. {
  53. for (int j = 0; j <= n; ++ j)
  54. Ans[j][j] = 1;
  55. for (int j = 1; j <= A; ++ j)
  56. {
  57. int goodA = j, badA = A - j, goodB = B - (A - j), badB = A - j;
  58. T[j][j] = A * A + B * B + 2 * goodA * badB + 2 * goodB * badA;
  59. int goodA2 = j - 1, badA2 = A - j + 1, goodB2 = B - (A - j + 1), badB2 = A - j + 1;
  60. if (j > 1) T[j - 1][j] = 2 * badA2 * badB2;
  61. if (j < A)
  62. {
  63. int goodA3 = j + 1, badA3 = A - j - 1, goodB3 = B - (A - j - 1), badB3 = A - j - 1;
  64. T[j + 1][j] = 2 * (goodA3 * goodB3);
  65. }
  66. }
  67.  
  68. }
  69. void readData(int &n, int &m, int &A, int &B)
  70. {
  71. scanf("%d%d", &n, &m);
  72.  
  73. for (int i = 0 ; i < n; ++ i)
  74. {
  75. scanf("%d", &v[i]);
  76. if (v[i] > 0)
  77. ++ A;
  78. else
  79. ++ B;
  80. }
  81. }
  82. void updateData(const int &n, int &A, int &B)
  83. {
  84. bool morePositives = (A > B);
  85. if (!morePositives)
  86. swap(A, B);
  87. for (int i = 0; i < n; ++ i)
  88. {
  89. if (!morePositives)
  90. v[i] = -v[i];
  91. if (v[i] > 0)
  92. v[i] = 0;
  93. else
  94. v[i] = 1;
  95. }
  96. }
  97.  
  98. int main()
  99. {
  100. int n, m, A = 0, B = 0;
  101. readData(n, m, A, B);
  102. updateData(n, A, B);
  103. computeMat(n, m, A, B);
  104. printProb(n, m, A, B);
  105. return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement