Advertisement
a53

alternant

a53
Feb 23rd, 2020
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define maxN 102
  3. #define maxM 1000000000
  4. #define mod 1000000009
  5. using namespace std;
  6. FILE *fin = freopen("alternant.in", "r", stdin);
  7. FILE *fout = freopen("alternant.out", "w", stdout);
  8. int dp[2][maxN], v[maxN];
  9. int T[maxN][maxN], Ans[maxN][maxN];
  10.  
  11. int lgPow(int a, int b)
  12. {
  13. int ret = 1;
  14. for (int i = 0; (1 << i) <= b; ++ i, a = (1LL * a * a) % mod)
  15. if (b & (1 << i))
  16. ret = (1LL * ret * a) % mod;
  17. return ret;
  18. }
  19.  
  20. void mul(int n, int a[maxN][maxN], int b[maxN][maxN])
  21. {
  22. int res[maxN][maxN];
  23. for (int i = 0; i < n; ++ i)
  24. for (int j = 0; j < n; ++ j)
  25. {
  26. res[i][j] = 0;
  27. for (int k = 0; k < n; ++ k)
  28. res[i][j] = (1LL * res[i][j] + 1LL * a[i][k] * b[k][j]) % mod;
  29. }
  30. memcpy(a, res, sizeof(res));
  31. }
  32.  
  33. void printProb(const int &n, const int &m, const int &A, const int &B)
  34. {
  35. int pos = 0;
  36. for (int i = 0; i < n; i += 2)
  37. {
  38. if (v[i] == 0)
  39. ++ pos;
  40. }
  41. for (int i = 0; (1 << i) <= m; ++ i, mul(n, T, T))
  42. if (m & (1 << i))
  43. mul(n, Ans, T);
  44. int ans = lgPow(n * n, mod - 1 - m);
  45. ans = (1LL * ans * Ans[pos][A]) % mod;
  46. printf("%d\n", ans);
  47. }
  48.  
  49. void computeMat(const int &n, const int &m, const int &A, const int &B)
  50. {
  51. for (int j = 0; j <= n; ++ j)
  52. Ans[j][j] = 1;
  53. for (int j = 1; j <= A; ++ j)
  54. {
  55. int goodA = j, badA = A - j, goodB = B - (A - j), badB = A - j;
  56. T[j][j] = A * A + B * B + 2 * goodA * badB + 2 * goodB * badA;
  57. int goodA2 = j - 1, badA2 = A - j + 1, goodB2 = B - (A - j + 1), badB2 = A - j + 1;
  58. if (j > 1) T[j - 1][j] = 2 * badA2 * badB2;
  59. if (j < A)
  60. {
  61. int goodA3 = j + 1, badA3 = A - j - 1, goodB3 = B - (A - j - 1), badB3 = A - j - 1;
  62. T[j + 1][j] = 2 * (goodA3 * goodB3);
  63. }
  64. }
  65.  
  66. }
  67.  
  68. void readData(int &n, int &m, int &A, int &B)
  69. {
  70. scanf("%d%d", &n, &m);
  71.  
  72. for (int i = 0 ; i < n; ++ i)
  73. {
  74. scanf("%d", &v[i]);
  75. if (v[i] > 0)
  76. ++ A;
  77. else
  78. ++ B;
  79. }
  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