fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. const int MOD = 1e9 + 7;
  7. const int MAXN = 500005;
  8.  
  9. long long fact[MAXN], inv[MAXN];
  10.  
  11. long long power(long long base, long long exp) {
  12. long long res = 1;
  13. base %= MOD;
  14. while (exp > 0) {
  15. if (exp % 2 == 1) res = (res * base) % MOD;
  16. base = (base * base) % MOD;
  17. exp /= 2;
  18. }
  19. return res;
  20. }
  21.  
  22. long long modInverse(long long n) {
  23. return power(n, MOD - 2);
  24. }
  25.  
  26. void precompute() {
  27. fact[0] = 1;
  28. inv[0] = 1;
  29. for (int i = 1; i < MAXN; i++) {
  30. fact[i] = (fact[i - 1] * i) % MOD;
  31. }
  32. inv[MAXN - 1] = modInverse(fact[MAXN - 1]);
  33. for (int i = MAXN - 2; i >= 1; i--) {
  34. inv[i] = (inv[i + 1] * (i + 1)) % MOD;
  35. }
  36. }
  37.  
  38. long long nCr(int n, int r) {
  39. if (r < 0 || r > n) return 0;
  40. return fact[n] * inv[r] % MOD * inv[n - r] % MOD;
  41. }
  42.  
  43. long long solve(int L, int R, const vector<long long>& a) {
  44. if (L > R) return 1;
  45.  
  46. int m = -1;
  47. for (int i = 0; L + i <= R - i; ++i) {
  48. if (a[L + i] == 1LL * (i + 1) * (R - (L + i) + 1)) {
  49. m = L + i;
  50. break;
  51. }
  52. if (a[R - i] == 1LL * (R - i - L + 1) * (i + 1)) {
  53. m = R - i;
  54. break;
  55. }
  56. }
  57.  
  58. if (m == -1) return 0;
  59.  
  60. long long left_ways = solve(L, m - 1, a);
  61. if (left_ways == 0) return 0;
  62.  
  63. long long right_ways = solve(m + 1, R, a);
  64. if (right_ways == 0) return 0;
  65.  
  66. long long ways = (left_ways * right_ways) % MOD;
  67. ways = (ways * nCr(R - L, m - L)) % MOD;
  68.  
  69. return ways;
  70. }
  71.  
  72. void run_case() {
  73. int n;
  74. cin >> n;
  75. vector<long long> a(n + 1);
  76. for (int i = 1; i <= n; i++) {
  77. cin >> a[i];
  78. }
  79. cout << solve(1, n, a) << "\n";
  80. }
  81.  
  82. int main() {
  83. ios_base::sync_with_stdio(false);
  84. cin.tie(NULL);
  85. precompute();
  86.  
  87. int t;
  88. cin >> t;
  89. while (t--) {
  90. run_case();
  91. }
  92.  
  93. return 0;
  94. }
Success #stdin #stdout 0.01s 11456KB
stdin
4
3
1 4 1
4
1 2 3 4
4
1 6 1 2
3
3 3 3
stdout
2
1
3
0