Guest User

Untitled

a guest
Apr 8th, 2025
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.92 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long double ld;
  5. typedef long long ll;
  6. #define pb push_back
  7. #define iter(X) X.begin(), X.end()
  8.  
  9. const ll maxN = 5e3 + 1;
  10. const ll MOD = (ll)1e9 + 7;
  11. const ld PI = acos(-1);
  12.  
  13. // Corrected FFT implementation
  14. namespace FFT {
  15. struct Complex {
  16. ld x, y;
  17. Complex(ld x = 0, ld y = 0) : x(x), y(y) {}
  18. Complex operator+(const Complex &c) const { return Complex(x + c.x, y + c.y); }
  19. Complex operator-(const Complex &c) const { return Complex(x - c.x, y - c.y); }
  20. Complex operator*(const Complex &c) const { return Complex(x * c.x - y * c.y, x * c.y + y * c.x); }
  21. };
  22.  
  23. void fft(vector<Complex> &a, bool invert) {
  24. int n = a.size();
  25. for (int i = 1, j = 0; i < n; i++) {
  26. int bit = n >> 1;
  27. for (; j >= bit; bit >>= 1) j -= bit;
  28. j += bit;
  29. if (i < j) swap(a[i], a[j]);
  30. }
  31.  
  32. for (int len = 2; len <= n; len <<= 1) {
  33. ld ang = 2 * PI / len * (invert ? -1 : 1);
  34. Complex wlen(cos(ang), sin(ang));
  35. for (int i = 0; i < n; i += len) {
  36. Complex w(1, 0);
  37. for (int j = 0; j < len / 2; j++) {
  38. Complex u = a[i + j], v = a[i + j + len / 2] * w;
  39. a[i + j] = u + v;
  40. a[i + j + len / 2] = u - v;
  41. w = w * wlen;
  42. }
  43. }
  44. }
  45.  
  46. if (invert) {
  47. for (Complex &x : a) x.x /= n, x.y /= n;
  48. }
  49. }
  50.  
  51. vector<ll> multiply(const vector<ll> &a, const vector<ll> &b) {
  52. // Trim leading zeros first
  53. int asize = a.size(), bsize = b.size();
  54. while (asize > 0 && a[asize-1] == 0) asize--;
  55. while (bsize > 0 && b[bsize-1] == 0) bsize--;
  56.  
  57. int n = 1;
  58. while (n < asize + bsize) n <<= 1;
  59. vector<Complex> fa(n), fb(n);
  60. for (int i = 0; i < asize; i++) fa[i] = Complex(a[i], 0);
  61. for (int i = 0; i < bsize; i++) fb[i] = Complex(b[i], 0);
  62.  
  63. fft(fa, false);
  64. fft(fb, false);
  65. for (int i = 0; i < n; i++) fa[i] = fa[i] * fb[i];
  66. fft(fa, true);
  67.  
  68. vector<ll> res(n);
  69. for (int i = 0; i < n; i++) {
  70. res[i] = (ll)(fa[i].x + 0.5) % MOD;
  71. }
  72.  
  73. // Trim trailing zeros
  74. while (!res.empty() && res.back() == 0) res.pop_back();
  75. return res;
  76. }
  77. }
  78.  
  79. // Your existing code remains unchanged
  80. vector<ll> fact(maxN + 1, 1);
  81. vector<ll> invFact(maxN + 1, 0);
  82.  
  83. ll binpow(ll a, ll b) {
  84. a %= MOD;
  85. ll res = 1;
  86. while (b > 0) {
  87. if (b & 1) res = res * a % MOD;
  88. a = a * a % MOD;
  89. b >>= 1;
  90. }
  91. return res % MOD;
  92. }
  93.  
  94. void prec() {
  95. for (ll i = 2; i <= maxN; i++) {
  96. fact[i] = (fact[i-1] * i) % MOD;
  97. }
  98. invFact[maxN] = binpow(fact[maxN], MOD-2);
  99. for (ll i = maxN-1; i >= 0; --i) {
  100. invFact[i] = (invFact[i+1] * (i+1)) % MOD;
  101. }
  102. }
  103.  
  104. ll C(ll n, ll r) {
  105. if (r < 0 || n < 0 || r > n) return 0;
  106. return (fact[n] * invFact[r] % MOD) * invFact[n-r] % MOD;
  107. }
  108.  
  109. void solve() {
  110. int n;
  111. cin >> n;
  112. vector<ll> v(n);
  113. for (auto &a : v) cin >> a;
  114.  
  115. vector<ll> pfx(n, 0);
  116. pfx[0] = (v[0] == -1);
  117. for (int i = 1; i < n; ++i) {
  118. pfx[i] = pfx[i-1] + (v[i] == -1);
  119. }
  120.  
  121. ll res = 0;
  122. for (int k = 0; k <= n-1; ++k) {
  123.  
  124. bool t =1;
  125.  
  126. int MinJ = 0, MaxI = n-1;
  127. for (int i = 0; i < n; ++i) {
  128. if (v[i] != -1 && v[i] <= k) {
  129. t = 0;
  130. MinJ = max(MinJ, i);
  131. MaxI = min(MaxI, i);
  132. }
  133. }
  134.  
  135. ll val = 0;
  136. for (int i = 0; i < n; ++i) {
  137. if (v[i] != -1 && v[i] <= k) val++;
  138. }
  139.  
  140. vector<ll> L(n+1, 0), R(n+1, 0);
  141. int tmpL = 0, tmpR = 0;
  142.  
  143. for (int i = MaxI; i >= 0; --i) {
  144. if (v[i] == -1) tmpL++;
  145. L[tmpL]++;
  146. }
  147. for (int i = MinJ; i < n; ++i) {
  148. if (v[i] == -1) tmpR++;
  149. R[tmpR]++;
  150. }
  151.  
  152. // FFT-based convolution
  153. vector<ll> conv = FFT::multiply(L, R);
  154.  
  155. ll need = k+1 - val;
  156.  
  157. /*
  158. if (t){
  159.  
  160. //It seems i need to fix this part.
  161.  
  162.  
  163. continue;
  164. }
  165. */
  166.  
  167. for (ll i = 0; i <= tmpL + tmpR; ++i){
  168. ll Minuses = pfx[MinJ] - (MaxI == 0 ? 0 : pfx[MaxI-1]) + i;
  169. if (Minuses < 0 || Minuses > pfx[n-1]) continue;
  170. ll term = (conv[i] * C(Minuses, need)) % MOD;
  171. term = (term * fact[need]) % MOD;
  172. term = (term * fact[pfx[n-1] - need]) % MOD;
  173. res = (res + term) % MOD;
  174. }
  175.  
  176. }
  177. cout << res << endl;
  178. }
  179.  
  180.  
  181. int main() {
  182. ios::sync_with_stdio(false);
  183. cin.tie(nullptr);
  184. prec();
  185. int t;
  186. cin >> t;
  187. while (t--) solve();
  188. return 0;
  189. }
Advertisement
Add Comment
Please, Sign In to add comment