a53

crescator2

a53
Jan 19th, 2021
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. #include<fstream>
  2. #define DIM 600005
  3. #define mod 1000000007
  4. using namespace std;
  5. int n, i, p, lst, m, sol;
  6. int fact[DIM], inv[DIM], v[DIM];
  7. ifstream fin("crescator.in");
  8. ofstream fout("crescator.out");
  9. int mult(int x, int e){
  10. if(e == 0){
  11. return 1;
  12. }
  13. else{
  14. int a = mult(x, e / 2);
  15. if(e % 2 == 0){
  16. return a * 1LL * a % mod;
  17. }
  18. else{
  19. return a * 1LL * a % mod * x % mod;
  20. }
  21. }
  22. }
  23. int comb(int n, int k){
  24. return fact[n] * 1LL * inv[k] % mod * inv[n - k] % mod;
  25. }
  26. int cr(int n, int k){
  27. if(n == 0){
  28. return 1;
  29. }
  30. return comb(n + k - 1, n - 1);
  31. }
  32. int main(){
  33. fin>> n;
  34. for(i = 1; i <= n; i++){
  35. fin>> v[i];
  36. }
  37. m = v[n] + n;
  38. fact[0] = 1;
  39. for(i = 1; i <= m; i++){
  40. fact[i] = fact[i - 1] * 1LL * i % mod;
  41. }
  42. inv[m] = mult(fact[m], mod - 2);
  43. for(i = m - 1; i >= 0; i--){
  44. inv[i] = inv[i + 1] * 1LL * (i + 1) % mod;
  45. }
  46. sol = 1;
  47. lst = 1;
  48. for(i = 2; i <= n; i++){
  49. if(v[i] > 0){
  50. if(v[lst] > v[i]){
  51. sol = 0;
  52. }
  53. if(p == 0 || v[p] < v[lst] || v[p] > v[i]){
  54. sol = sol * 1LL * cr(v[i] - v[lst] + 1, i - lst - 1) % mod;
  55. }
  56. else{
  57. sol = sol * 1LL * ( cr(v[i] - v[lst] + 1, i - lst - 1) - cr(v[i] - v[p] + 1, i - p - 1) * 1LL * cr(v[p] - v[lst] + 1, p - lst - 1) % mod) % mod;
  58. if(sol < 0){
  59. sol += mod;
  60. }
  61. }
  62. lst = i;
  63. p = 0;
  64. }
  65. else if(v[i] < 0){
  66. p = i;
  67. v[p] *= -1;
  68. }
  69. }
  70. fout<< sol;
  71. return 0;
  72. }
  73.  
Advertisement
Add Comment
Please, Sign In to add comment