fork download
  1. #pragma GCC optimize ("Ofast")
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. #define MD (1000000007U)
  5. template<class T> struct cLtraits_identity{
  6. using type = T;
  7. }
  8. ;
  9. template<class T> using cLtraits_try_make_signed =
  10. typename conditional<
  11. is_integral<T>::value,
  12. make_signed<T>,
  13. cLtraits_identity<T>
  14. >::type;
  15. template <class S, class T> struct cLtraits_common_type{
  16. using tS = typename cLtraits_try_make_signed<S>::type;
  17. using tT = typename cLtraits_try_make_signed<T>::type;
  18. using type = typename common_type<tS,tT>::type;
  19. }
  20. ;
  21. void*wmem;
  22. char memarr[96000000];
  23. template<class S, class T> inline auto min_L(S a, T b)
  24. -> typename cLtraits_common_type<S,T>::type{
  25. return (typename cLtraits_common_type<S,T>::type) a <= (typename cLtraits_common_type<S,T>::type) b ? a : b;
  26. }
  27. template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){
  28. static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
  29. (*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );
  30. (*arr)=(T*)(*mem);
  31. (*mem)=((*arr)+x);
  32. }
  33. template<class T> inline void walloc1d(T **arr, int x1, int x2, void **mem = &wmem){
  34. walloc1d(arr, x2-x1, mem);
  35. (*arr) -= x1;
  36. }
  37. struct Modint{
  38. unsigned val;
  39. Modint(){
  40. val=0;
  41. }
  42. Modint(int a){
  43. val = ord(a);
  44. }
  45. Modint(unsigned a){
  46. val = ord(a);
  47. }
  48. Modint(long long a){
  49. val = ord(a);
  50. }
  51. Modint(unsigned long long a){
  52. val = ord(a);
  53. }
  54. inline unsigned ord(unsigned a){
  55. return a%MD;
  56. }
  57. inline unsigned ord(int a){
  58. a %= (int)MD;
  59. if(a < 0){
  60. a += MD;
  61. }
  62. return a;
  63. }
  64. inline unsigned ord(unsigned long long a){
  65. return a%MD;
  66. }
  67. inline unsigned ord(long long a){
  68. a %= (int)MD;
  69. if(a < 0){
  70. a += MD;
  71. }
  72. return a;
  73. }
  74. inline unsigned get(){
  75. return val;
  76. }
  77. inline Modint &operator++(){
  78. val++;
  79. if(val >= MD){
  80. val -= MD;
  81. }
  82. return *this;
  83. }
  84. inline Modint &operator--(){
  85. if(val == 0){
  86. val = MD - 1;
  87. }
  88. else{
  89. --val;
  90. }
  91. return *this;
  92. }
  93. inline Modint operator++(int a){
  94. Modint res(*this);
  95. val++;
  96. if(val >= MD){
  97. val -= MD;
  98. }
  99. return res;
  100. }
  101. inline Modint operator--(int a){
  102. Modint res(*this);
  103. if(val == 0){
  104. val = MD - 1;
  105. }
  106. else{
  107. --val;
  108. }
  109. return res;
  110. }
  111. inline Modint &operator+=(Modint a){
  112. val += a.val;
  113. if(val >= MD){
  114. val -= MD;
  115. }
  116. return *this;
  117. }
  118. inline Modint &operator-=(Modint a){
  119. if(val < a.val){
  120. val = val + MD - a.val;
  121. }
  122. else{
  123. val -= a.val;
  124. }
  125. return *this;
  126. }
  127. inline Modint &operator*=(Modint a){
  128. val = ((unsigned long long)val*a.val)%MD;
  129. return *this;
  130. }
  131. inline Modint &operator/=(Modint a){
  132. return *this *= a.inverse();
  133. }
  134. inline Modint operator+(Modint a){
  135. return Modint(*this)+=a;
  136. }
  137. inline Modint operator-(Modint a){
  138. return Modint(*this)-=a;
  139. }
  140. inline Modint operator*(Modint a){
  141. return Modint(*this)*=a;
  142. }
  143. inline Modint operator/(Modint a){
  144. return Modint(*this)/=a;
  145. }
  146. inline Modint operator+(int a){
  147. return Modint(*this)+=Modint(a);
  148. }
  149. inline Modint operator-(int a){
  150. return Modint(*this)-=Modint(a);
  151. }
  152. inline Modint operator*(int a){
  153. return Modint(*this)*=Modint(a);
  154. }
  155. inline Modint operator/(int a){
  156. return Modint(*this)/=Modint(a);
  157. }
  158. inline Modint operator+(long long a){
  159. return Modint(*this)+=Modint(a);
  160. }
  161. inline Modint operator-(long long a){
  162. return Modint(*this)-=Modint(a);
  163. }
  164. inline Modint operator*(long long a){
  165. return Modint(*this)*=Modint(a);
  166. }
  167. inline Modint operator/(long long a){
  168. return Modint(*this)/=Modint(a);
  169. }
  170. inline Modint operator-(void){
  171. Modint res;
  172. if(val){
  173. res.val=MD-val;
  174. }
  175. else{
  176. res.val=0;
  177. }
  178. return res;
  179. }
  180. inline operator bool(void){
  181. return val!=0;
  182. }
  183. inline operator int(void){
  184. return get();
  185. }
  186. inline operator long long(void){
  187. return get();
  188. }
  189. inline Modint inverse(){
  190. int a = val;
  191. int b = MD;
  192. int u = 1;
  193. int v = 0;
  194. int t;
  195. Modint res;
  196. while(b){
  197. t = a / b;
  198. a -= t * b;
  199. swap(a, b);
  200. u -= t * v;
  201. swap(u, v);
  202. }
  203. if(u < 0){
  204. u += MD;
  205. }
  206. res.val = u;
  207. return res;
  208. }
  209. inline Modint pw(unsigned long long b){
  210. Modint a(*this);
  211. Modint res;
  212. res.val = 1;
  213. while(b){
  214. if(b&1){
  215. res *= a;
  216. }
  217. b >>= 1;
  218. a *= a;
  219. }
  220. return res;
  221. }
  222. inline bool operator==(int a){
  223. return ord(a)==val;
  224. }
  225. inline bool operator!=(int a){
  226. return ord(a)!=val;
  227. }
  228. }
  229. ;
  230. inline Modint operator+(int a, Modint b){
  231. return Modint(a)+=b;
  232. }
  233. inline Modint operator-(int a, Modint b){
  234. return Modint(a)-=b;
  235. }
  236. inline Modint operator*(int a, Modint b){
  237. return Modint(a)*=b;
  238. }
  239. inline Modint operator/(int a, Modint b){
  240. return Modint(a)/=b;
  241. }
  242. inline Modint operator+(long long a, Modint b){
  243. return Modint(a)+=b;
  244. }
  245. inline Modint operator-(long long a, Modint b){
  246. return Modint(a)-=b;
  247. }
  248. inline Modint operator*(long long a, Modint b){
  249. return Modint(a)*=b;
  250. }
  251. inline Modint operator/(long long a, Modint b){
  252. return Modint(a)/=b;
  253. }
  254. inline int my_getchar_unlocked(){
  255. static char buf[1048576];
  256. static int s = 1048576;
  257. static int e = 1048576;
  258. if(s == e && e == 1048576){
  259. e = fread_unlocked(buf, 1, 1048576, stdin);
  260. s = 0;
  261. }
  262. if(s == e){
  263. return EOF;
  264. }
  265. return buf[s++];
  266. }
  267. inline void rd(int &x){
  268. int k;
  269. int m=0;
  270. x=0;
  271. for(;;){
  272. k = my_getchar_unlocked();
  273. if(k=='-'){
  274. m=1;
  275. break;
  276. }
  277. if('0'<=k&&k<='9'){
  278. x=k-'0';
  279. break;
  280. }
  281. }
  282. for(;;){
  283. k = my_getchar_unlocked();
  284. if(k<'0'||k>'9'){
  285. break;
  286. }
  287. x=x*10+k-'0';
  288. }
  289. if(m){
  290. x=-x;
  291. }
  292. }
  293. inline void rd(long long &x){
  294. int k;
  295. int m=0;
  296. x=0;
  297. for(;;){
  298. k = my_getchar_unlocked();
  299. if(k=='-'){
  300. m=1;
  301. break;
  302. }
  303. if('0'<=k&&k<='9'){
  304. x=k-'0';
  305. break;
  306. }
  307. }
  308. for(;;){
  309. k = my_getchar_unlocked();
  310. if(k<'0'||k>'9'){
  311. break;
  312. }
  313. x=x*10+k-'0';
  314. }
  315. if(m){
  316. x=-x;
  317. }
  318. }
  319. inline int rd_int(void){
  320. int x;
  321. rd(x);
  322. return x;
  323. }
  324. struct MY_WRITER{
  325. char buf[1048576];
  326. int s;
  327. int e;
  328. MY_WRITER(){
  329. s = 0;
  330. e = 1048576;
  331. }
  332. ~MY_WRITER(){
  333. if(s){
  334. fwrite_unlocked(buf, 1, s, stdout);
  335. }
  336. }
  337. }
  338. ;
  339. MY_WRITER MY_WRITER_VAR;
  340. void my_putchar_unlocked(int a){
  341. if(MY_WRITER_VAR.s == MY_WRITER_VAR.e){
  342. fwrite_unlocked(MY_WRITER_VAR.buf, 1, MY_WRITER_VAR.s, stdout);
  343. MY_WRITER_VAR.s = 0;
  344. }
  345. MY_WRITER_VAR.buf[MY_WRITER_VAR.s++] = a;
  346. }
  347. inline void wt_L(char a){
  348. my_putchar_unlocked(a);
  349. }
  350. inline void wt_L(int x){
  351. int s=0;
  352. int m=0;
  353. char f[10];
  354. if(x<0){
  355. m=1;
  356. x=-x;
  357. }
  358. while(x){
  359. f[s++]=x%10;
  360. x/=10;
  361. }
  362. if(!s){
  363. f[s++]=0;
  364. }
  365. if(m){
  366. my_putchar_unlocked('-');
  367. }
  368. while(s--){
  369. my_putchar_unlocked(f[s]+'0');
  370. }
  371. }
  372. inline void wt_L(unsigned x){
  373. int s=0;
  374. char f[10];
  375. while(x){
  376. f[s++]=x%10;
  377. x/=10;
  378. }
  379. if(!s){
  380. f[s++]=0;
  381. }
  382. while(s--){
  383. my_putchar_unlocked(f[s]+'0');
  384. }
  385. }
  386. inline void wt_L(long long x){
  387. int s=0;
  388. int m=0;
  389. char f[20];
  390. if(x<0){
  391. m=1;
  392. x=-x;
  393. }
  394. while(x){
  395. f[s++]=x%10;
  396. x/=10;
  397. }
  398. if(!s){
  399. f[s++]=0;
  400. }
  401. if(m){
  402. my_putchar_unlocked('-');
  403. }
  404. while(s--){
  405. my_putchar_unlocked(f[s]+'0');
  406. }
  407. }
  408. inline void wt_L(unsigned long long x){
  409. int s=0;
  410. char f[21];
  411. while(x){
  412. f[s++]=x%10;
  413. x/=10;
  414. }
  415. if(!s){
  416. f[s++]=0;
  417. }
  418. while(s--){
  419. my_putchar_unlocked(f[s]+'0');
  420. }
  421. }
  422. inline void wt_L(Modint x){
  423. int i;
  424. i = (int)x;
  425. wt_L(i);
  426. }
  427. int WRITER_DOUBLE_DIGIT = 15;
  428. inline int writerDigit_double(){
  429. return WRITER_DOUBLE_DIGIT;
  430. }
  431. inline void writerDigit_double(int d){
  432. WRITER_DOUBLE_DIGIT = d;
  433. }
  434. inline void wt_L(double x){
  435. const int d = WRITER_DOUBLE_DIGIT;
  436. int k;
  437. int r;
  438. double v;
  439. if(x!=x || (x==x+1 && x==2*x)){
  440. my_putchar_unlocked('E');
  441. my_putchar_unlocked('r');
  442. my_putchar_unlocked('r');
  443. return;
  444. }
  445. if(x < 0){
  446. my_putchar_unlocked('-');
  447. x = -x;
  448. }
  449. x += 0.5 * pow(0.1, d);
  450. r = 0;
  451. v = 1;
  452. while(x >= 10*v){
  453. v *= 10;
  454. r++;
  455. }
  456. while(r >= 0){
  457. r--;
  458. k = floor(x / v);
  459. if(k >= 10){
  460. k = 9;
  461. }
  462. if(k <= -1){
  463. k = 0;
  464. }
  465. x -= k * v;
  466. v *= 0.1;
  467. my_putchar_unlocked(k + '0');
  468. }
  469. if(d > 0){
  470. my_putchar_unlocked('.');
  471. v = 1;
  472. for(r=(0);r<(d);r++){
  473. v *= 0.1;
  474. k = floor(x / v);
  475. if(k >= 10){
  476. k = 9;
  477. }
  478. if(k <= -1){
  479. k = 0;
  480. }
  481. x -= k * v;
  482. my_putchar_unlocked(k + '0');
  483. }
  484. }
  485. }
  486. inline void wt_L(const char c[]){
  487. int i=0;
  488. for(i=0;c[i]!='\0';i++){
  489. my_putchar_unlocked(c[i]);
  490. }
  491. }
  492. inline void wt_L(string &x){
  493. int i=0;
  494. for(i=0;x[i]!='\0';i++){
  495. my_putchar_unlocked(x[i]);
  496. }
  497. }
  498. template<class S, class T> inline S chmax(S &a, T b){
  499. if(a<b){
  500. a=b;
  501. }
  502. return a;
  503. }
  504. template<class T> struct Comb{
  505. int mem_fact;
  506. T*factri;
  507. T*ifactri;
  508. int mem_dfact;
  509. T*dfactri;
  510. int mem_pw2;
  511. int mem_pw3;
  512. int mem_pw10;
  513. int mem_rep1;
  514. T*pw2c;
  515. T*pw3c;
  516. T*pw10c;
  517. T*rep1c;
  518. int mem_ipw2;
  519. int mem_ipw3;
  520. int mem_ipw10;
  521. T*ipw2c;
  522. T*ipw3c;
  523. T*ipw10c;
  524. Comb(){
  525. mem_fact = 0;
  526. mem_dfact = 0;
  527. mem_pw2 = mem_pw3 = mem_pw10 = mem_rep1 = 0;
  528. mem_ipw2 = mem_ipw3 = mem_ipw10 = 0;
  529. }
  530. inline void expand_fact(int k){
  531. int i;
  532. if(k <= mem_fact){
  533. return;
  534. }
  535. chmax(k, 2 * mem_fact);
  536. if(mem_fact == 0){
  537. factri = (T*)malloc(k * sizeof(T));
  538. ifactri = (T*)malloc(k * sizeof(T));
  539. factri[0] = 1;
  540. for(i=(1);i<(k);i++){
  541. factri[i] = i * factri[i-1];
  542. }
  543. ifactri[k-1] = 1 / factri[k-1];
  544. for(i=(k-1)-1;i>=(0);i--){
  545. ifactri[i] = (i+1) * ifactri[i+1];
  546. }
  547. }
  548. else{
  549. factri = (T*)realloc(factri, k * sizeof(T));
  550. ifactri = (T*)realloc(ifactri, k * sizeof(T));
  551. for(i=(mem_fact);i<(k);i++){
  552. factri[i] = i * factri[i-1];
  553. }
  554. ifactri[k-1] = 1 / factri[k-1];
  555. for(i=(k-1)-1;i>=(mem_fact);i--){
  556. ifactri[i] = (i+1) * ifactri[i+1];
  557. }
  558. }
  559. mem_fact = k;
  560. }
  561. inline T fac(int k){
  562. if(mem_fact < k+1){
  563. expand_fact(k+1);
  564. }
  565. return factri[k];
  566. }
  567. inline T ifac(int k){
  568. if(mem_fact < k+1){
  569. expand_fact(k+1);
  570. }
  571. return ifactri[k];
  572. }
  573. inline T C(int a, int b){
  574. if(b < 0 || b > a){
  575. return 0;
  576. }
  577. if(mem_fact < a+1){
  578. expand_fact(a+1);
  579. }
  580. return factri[a] * ifactri[b] * ifactri[a-b];
  581. }
  582. inline T P(int a, int b){
  583. if(b < 0 || b > a){
  584. return 0;
  585. }
  586. if(mem_fact < a+1){
  587. expand_fact(a+1);
  588. }
  589. return factri[a] * ifactri[a-b];
  590. }
  591. inline T H(int a, int b){
  592. if(a==0 && b==0){
  593. return 1;
  594. }
  595. if(a <= 0 || b < 0){
  596. return 0;
  597. }
  598. if(mem_fact < a+b){
  599. expand_fact(a+b);
  600. }
  601. return C(a+b-1, b);
  602. }
  603. inline T Multinomial(int sz, int a[]){
  604. int i;
  605. int s = 0;
  606. T res;
  607. for(i=(0);i<(sz);i++){
  608. s += a[i];
  609. }
  610. if(mem_fact < s+1){
  611. expand_fact(s+1);
  612. }
  613. res = factri[s];
  614. for(i=(0);i<(sz);i++){
  615. res *= ifactri[a[i]];
  616. }
  617. return 1;
  618. }
  619. inline T Multinomial(int a){
  620. return 1;
  621. }
  622. inline T Multinomial(int a, int b){
  623. if(mem_fact < a+b+1){
  624. expand_fact(a+b+1);
  625. }
  626. return factri[a+b] * ifactri[a] * ifactri[b];
  627. }
  628. inline T Multinomial(int a, int b, int c){
  629. if(mem_fact < a+b+c+1){
  630. expand_fact(a+b+c+1);
  631. }
  632. return factri[a+b+c] * ifactri[a] * ifactri[b] * ifactri[c];
  633. }
  634. inline T Multinomial(int a, int b, int c, int d){
  635. if(mem_fact < a+b+c+d+1){
  636. expand_fact(a+b+c+d+1);
  637. }
  638. return factri[a+b+c+d] * ifactri[a] * ifactri[b] * ifactri[c] * ifactri[d];
  639. }
  640. inline T Catalan(int n){
  641. if(n < 0){
  642. return 0;
  643. }
  644. if(mem_fact < 2*n+1){
  645. expand_fact(2*n+1);
  646. }
  647. return factri[2*n] * ifactri[n] * ifactri[n+1];
  648. }
  649. inline T C_s(long long a, long long b){
  650. long long i;
  651. T res;
  652. if(b < 0 || b > a){
  653. return 0;
  654. }
  655. if(b > a - b){
  656. b = a - b;
  657. }
  658. res = 1;
  659. for(i=(0);i<(b);i++){
  660. res *= a - i;
  661. res /= i + 1;
  662. }
  663. return res;
  664. }
  665. inline T P_s(long long a, long long b){
  666. long long i;
  667. T res;
  668. if(b < 0 || b > a){
  669. return 0;
  670. }
  671. res = 1;
  672. for(i=(0);i<(b);i++){
  673. res *= a - i;
  674. }
  675. return res;
  676. }
  677. inline T per_s(long long n, long long k){
  678. T d;
  679. int m;
  680. if(n < 0 || k < 0){
  681. return 0;
  682. }
  683. if(n == k && k == 0){
  684. return 1;
  685. }
  686. if(n == 0 || k == 0){
  687. return 0;
  688. }
  689. if(k==1){
  690. return 1;
  691. }
  692. if(k==2){
  693. d = n / 2;
  694. return d;
  695. }
  696. if(k==3){
  697. d = (n-1) / 6;
  698. m = (n-1) % 6;
  699. if(m==0){
  700. return 3 * d * d + d;
  701. }
  702. if(m==1){
  703. return 3 * d * d + 2 * d;
  704. }
  705. if(m==2){
  706. return 3 * d * d + 3 * d + 1;
  707. }
  708. if(m==3){
  709. return 3 * d * d + 4 * d + 1;
  710. }
  711. if(m==4){
  712. return 3 * d * d + 5 * d + 2;
  713. }
  714. if(m==5){
  715. return 3 * d * d + 6 * d + 3;
  716. }
  717. }
  718. assert(0 && "per_s should be k <= 3");
  719. return -1;
  720. }
  721. inline void expand_dfact(int k){
  722. int i;
  723. if(k <= mem_dfact){
  724. return;
  725. }
  726. chmax(k, 3);
  727. chmax(k, 2 * mem_dfact);
  728. if(mem_dfact==0){
  729. dfactri = (T*)malloc(k * sizeof(T));
  730. dfactri[0] = dfactri[1] = 1;
  731. for(i=(2);i<(k);i++){
  732. dfactri[i] = i * dfactri[i-2];
  733. }
  734. }
  735. else{
  736. dfactri = (T*)realloc(dfactri, k * sizeof(T));
  737. for(i=(mem_dfact);i<(k);i++){
  738. dfactri[i] = i * dfactri[i-2];
  739. }
  740. }
  741. mem_dfact = k;
  742. }
  743. inline void expand_pw2(int k){
  744. int i;
  745. if(k <= mem_pw2){
  746. return;
  747. }
  748. chmax(k, 2 * mem_pw2);
  749. if(mem_pw2==0){
  750. pw2c = (T*)malloc(k * sizeof(T));
  751. pw2c[0] = 1;
  752. for(i=(1);i<(k);i++){
  753. pw2c[i] = 2 * pw2c[i-1];
  754. }
  755. }
  756. else{
  757. pw2c = (T*)realloc(pw2c, k * sizeof(T));
  758. for(i=(mem_pw2);i<(k);i++){
  759. pw2c[i] = 2 * pw2c[i-1];
  760. }
  761. }
  762. mem_pw2 = k;
  763. }
  764. inline void expand_ipw2(int k){
  765. int i;
  766. if(k <= mem_ipw2){
  767. return;
  768. }
  769. chmax(k, 2);
  770. chmax(k, 2 * mem_ipw2);
  771. if(mem_ipw2==0){
  772. ipw2c = (T*)malloc(k * sizeof(T));
  773. ipw2c[0] = 1;
  774. ipw2c[1] = ipw2c[0] / 2;
  775. for(i=(1);i<(k);i++){
  776. ipw2c[i] = ipw2c[1] * ipw2c[i-1];
  777. }
  778. }
  779. else{
  780. ipw2c = (T*)realloc(ipw2c, k * sizeof(T));
  781. for(i=(mem_ipw2);i<(k);i++){
  782. ipw2c[i] = ipw2c[1] * ipw2c[i-1];
  783. }
  784. }
  785. mem_ipw2 = k;
  786. }
  787. inline void expand_pw3(int k){
  788. int i;
  789. if(k <= mem_pw3){
  790. return;
  791. }
  792. chmax(k, 2 * mem_pw3);
  793. if(mem_pw3==0){
  794. pw3c = (T*)malloc(k * sizeof(T));
  795. pw3c[0] = 1;
  796. for(i=(1);i<(k);i++){
  797. pw3c[i] = 3 * pw3c[i-1];
  798. }
  799. }
  800. else{
  801. pw3c = (T*)realloc(pw3c, k * sizeof(T));
  802. for(i=(mem_pw3);i<(k);i++){
  803. pw3c[i] = 3 * pw3c[i-1];
  804. }
  805. }
  806. mem_pw3 = k;
  807. }
  808. inline void expand_ipw3(int k){
  809. int i;
  810. if(k <= mem_ipw3){
  811. return;
  812. }
  813. chmax(k, 2);
  814. chmax(k, 2 * mem_ipw3);
  815. if(mem_ipw3==0){
  816. ipw3c = (T*)malloc(k * sizeof(T));
  817. ipw3c[0] = 1;
  818. ipw3c[1] = ipw3c[0] / 3;
  819. for(i=(1);i<(k);i++){
  820. ipw3c[i] = ipw3c[1] * ipw3c[i-1];
  821. }
  822. }
  823. else{
  824. ipw3c = (T*)realloc(ipw3c, k * sizeof(T));
  825. for(i=(mem_ipw3);i<(k);i++){
  826. ipw3c[i] = ipw3c[1] * ipw3c[i-1];
  827. }
  828. }
  829. mem_ipw3 = k;
  830. }
  831. inline void expand_pw10(int k){
  832. int i;
  833. if(k <= mem_pw10){
  834. return;
  835. }
  836. chmax(k, 2 * mem_pw10);
  837. if(mem_pw10==0){
  838. pw10c = (T*)malloc(k * sizeof(T));
  839. pw10c[0] = 1;
  840. for(i=(1);i<(k);i++){
  841. pw10c[i] = 10 * pw10c[i-1];
  842. }
  843. }
  844. else{
  845. pw10c = (T*)realloc(pw10c, k * sizeof(T));
  846. for(i=(mem_pw10);i<(k);i++){
  847. pw10c[i] = 10 * pw10c[i-1];
  848. }
  849. }
  850. mem_pw10 = k;
  851. }
  852. inline void expand_ipw10(int k){
  853. int i;
  854. if(k <= mem_ipw10){
  855. return;
  856. }
  857. chmax(k, 2);
  858. chmax(k, 2 * mem_ipw10);
  859. if(mem_ipw10==0){
  860. ipw10c = (T*)malloc(k * sizeof(T));
  861. ipw10c[0] = 1;
  862. ipw10c[1] = ipw10c[0] / 10;
  863. for(i=(1);i<(k);i++){
  864. ipw10c[i] = ipw10c[1] * ipw10c[i-1];
  865. }
  866. }
  867. else{
  868. ipw10c = (T*)realloc(ipw10c, k * sizeof(T));
  869. for(i=(mem_ipw10);i<(k);i++){
  870. ipw10c[i] = ipw10c[1] * ipw10c[i-1];
  871. }
  872. }
  873. mem_ipw10 = k;
  874. }
  875. inline void expand_rep1(int k){
  876. int i;
  877. if(k <= mem_rep1){
  878. return;
  879. }
  880. chmax(k, 2 * mem_rep1);
  881. if(mem_rep1==0){
  882. rep1c = (T*)malloc(k * sizeof(T));
  883. rep1c[0] = 0;
  884. for(i=(1);i<(k);i++){
  885. rep1c[i] = 10 * rep1c[i-1] + 1;
  886. }
  887. }
  888. else{
  889. rep1c = (T*)realloc(rep1c, k * sizeof(T));
  890. for(i=(mem_rep1);i<(k);i++){
  891. rep1c[i] = 10 * rep1c[i-1] + 1;
  892. }
  893. }
  894. mem_rep1 = k;
  895. }
  896. inline T dfac(int k){
  897. if(k >= 0){
  898. if(mem_dfact < k+1){
  899. expand_dfact(k+1);
  900. }
  901. return dfactri[k];
  902. }
  903. if(k==-1){
  904. return 1;
  905. }
  906. k = - k - 2;
  907. if(k % 4 == 1){
  908. return 1 / (-dfac(k));
  909. }
  910. return 1 / dfac(k);
  911. }
  912. inline T pw2(int k){
  913. if(k >= 0){
  914. if(mem_pw2 < k+1){
  915. expand_pw2(k+1);
  916. }
  917. return pw2c[k];
  918. }
  919. else{
  920. k = -k;
  921. if(mem_ipw2 < k+1){
  922. expand_ipw2(k+1);
  923. }
  924. return ipw2c[k];
  925. }
  926. }
  927. inline T pw3(int k){
  928. if(k >= 0){
  929. if(mem_pw3 < k+1){
  930. expand_pw3(k+1);
  931. }
  932. return pw3c[k];
  933. }
  934. else{
  935. k = -k;
  936. if(mem_ipw3 < k+1){
  937. expand_ipw3(k+1);
  938. }
  939. return ipw3c[k];
  940. }
  941. }
  942. inline T pw10(int k){
  943. if(k >= 0){
  944. if(mem_pw10 < k+1){
  945. expand_pw10(k+1);
  946. }
  947. return pw10c[k];
  948. }
  949. else{
  950. k = -k;
  951. if(mem_ipw10 < k+1){
  952. expand_ipw10(k+1);
  953. }
  954. return ipw10c[k];
  955. }
  956. }
  957. inline T repunit(int k){
  958. if(mem_rep1 < k+1){
  959. expand_rep1(k+1);
  960. }
  961. return rep1c[k];
  962. }
  963. }
  964. ;
  965. template<> inline Modint Comb<Modint>::C_s(long long a, long long b){
  966. long long i;
  967. Modint res;
  968. Modint d;
  969. if(b < 0 || b > a){
  970. return 0;
  971. }
  972. if(b > a - b){
  973. b = a - b;
  974. }
  975. res = d = 1;
  976. for(i=(0);i<(b);i++){
  977. res *= a - i;
  978. d *= i + 1;
  979. }
  980. return res / d;
  981. }
  982. template<class T> struct segtree{
  983. int N;
  984. int logN;
  985. T*sum;
  986. T*mn;
  987. int*mnind;
  988. T*fixval;
  989. char*fixed;
  990. T*addval;
  991. void malloc(int maxN, int once = 0){
  992. int i;
  993. for(i=1;i<maxN;i*=2){
  994. ;
  995. }
  996. sum = new T[2*i];
  997. mn = new T[2*i];
  998. mnind = new int[2*i];
  999. fixval = new T[i];
  1000. addval = new T[i];
  1001. fixed = new char[i];
  1002. if(once){
  1003. setN(maxN);
  1004. }
  1005. }
  1006. void walloc(int maxN, int once = 0, void **mem = &wmem){
  1007. int i;
  1008. for(i=1;i<maxN;i*=2){
  1009. ;
  1010. }
  1011. walloc1d(&sum, 2*i, mem);
  1012. walloc1d(&mn, 2*i, mem);
  1013. walloc1d(&mnind, 2*i, mem);
  1014. walloc1d(&fixval, i, mem);
  1015. walloc1d(&addval, i, mem);
  1016. walloc1d(&fixed, i, mem);
  1017. if(once){
  1018. setN(maxN);
  1019. }
  1020. }
  1021. void free(void){
  1022. delete [] sum;
  1023. delete [] mn;
  1024. delete [] mnind;
  1025. delete [] fixval;
  1026. delete [] addval;
  1027. delete [] fixed;
  1028. }
  1029. T& operator[](int i){
  1030. return sum[N+i];
  1031. }
  1032. void setN(int n, int zerofill = 1, int dobuild = 1){
  1033. int i;
  1034. for(i=1,logN=0;i<n;i*=2,logN++){
  1035. ;
  1036. }
  1037. N = i;
  1038. if(zerofill){
  1039. for(i=(0);i<(N);i++){
  1040. sum[N+i] = 0;
  1041. }
  1042. }
  1043. if(dobuild){
  1044. build();
  1045. }
  1046. }
  1047. void build(void){
  1048. int i;
  1049. for(i=(0);i<(N);i++){
  1050. mn[N+i] = sum[N+i];
  1051. mnind[N+i] = i;
  1052. }
  1053. for(i=N-1;i;i--){
  1054. sum[i] = sum[2*i] + sum[2*i+1];
  1055. if(mn[2*i] <= mn[2*i+1]){
  1056. mn[i] = mn[2*i];
  1057. mnind[i] = mnind[2*i];
  1058. }
  1059. else{
  1060. mn[i] = mn[2*i+1];
  1061. mnind[i] = mnind[2*i+1];
  1062. }
  1063. }
  1064. int g65CQCoC = N;
  1065. for(i=(1);i<(g65CQCoC);i++){
  1066. fixed[i] = 0;
  1067. }
  1068. int emd5LSgV = N;
  1069. for(i=(1);i<(emd5LSgV);i++){
  1070. addval[i] = 0;
  1071. }
  1072. }
  1073. inline void push_one(int a, int sz, int st){
  1074. if(fixed[a]){
  1075. if(sz > 1){
  1076. fixed[a*2] = fixed[a*2+1] = 1;
  1077. fixval[a*2] = fixval[a*2+1] = fixval[a];
  1078. sum[a*2] = sum[a*2+1] = sz * fixval[a];
  1079. mn[a*2] = mn[a*2+1] = fixval[a];
  1080. mnind[a*2] = st;
  1081. mnind[a*2+1] = st + sz;
  1082. }
  1083. else{
  1084. sum[a*2] = sum[a*2+1] = sz * fixval[a];
  1085. mn[a*2] = mn[a*2+1] = fixval[a];
  1086. mnind[a*2] = st;
  1087. mnind[a*2+1] = st + sz;
  1088. }
  1089. fixed[a] = 0;
  1090. addval[a] = 0;
  1091. return;
  1092. }
  1093. if(addval[a] != 0){
  1094. if(sz > 1){
  1095. if(fixed[a*2]){
  1096. fixval[a*2] += addval[a];
  1097. }
  1098. else{
  1099. addval[a*2] += addval[a];
  1100. }
  1101. if(fixed[a*2+1]){
  1102. fixval[a*2+1] += addval[a];
  1103. }
  1104. else{
  1105. addval[a*2+1] += addval[a];
  1106. }
  1107. sum[a*2] += sz * addval[a];
  1108. sum[a*2+1] += sz * addval[a];
  1109. mn[a*2] += addval[a];
  1110. mn[a*2+1] += addval[a];
  1111. }
  1112. else{
  1113. sum[a*2] += sz * addval[a];
  1114. sum[a*2+1] += sz * addval[a];
  1115. mn[a*2] += addval[a];
  1116. mn[a*2+1] += addval[a];
  1117. }
  1118. addval[a] = 0;
  1119. return;
  1120. }
  1121. }
  1122. inline void push(int a){
  1123. int i;
  1124. int aa = a - N;
  1125. int nd;
  1126. int sz;
  1127. int st;
  1128. for(i=logN;i;i--){
  1129. nd = a>>i;
  1130. sz = 1<<(i-1);
  1131. st = 2 * sz * (aa>>i);
  1132. push_one(nd, sz, st);
  1133. }
  1134. }
  1135. inline void build(int a){
  1136. int sz = 1;
  1137. int st = a - N;
  1138. while(a > 1){
  1139. if(a%2){
  1140. st += sz;
  1141. }
  1142. a /= 2;
  1143. sz *= 2;
  1144. if(fixed[a]){
  1145. sum[a] = sz * fixval[a];
  1146. mn[a] = fixval[a];
  1147. }
  1148. else{
  1149. sum[a] = sum[a*2] + sum[a*2+1];
  1150. if(mn[a*2] <= mn[a*2+1]){
  1151. mn[a] = mn[a*2];
  1152. mnind[a] = mnind[a*2];
  1153. }
  1154. else{
  1155. mn[a] = mn[a*2+1];
  1156. mnind[a] = mnind[a*2+1];
  1157. }
  1158. if(addval[a] != 0){
  1159. mn[a] += addval[a];
  1160. sum[a] += sz * addval[a];
  1161. }
  1162. }
  1163. }
  1164. }
  1165. inline void change(int a, int b, T val){
  1166. int sz = 1;
  1167. int aa;
  1168. int bb;
  1169. int st_a = a;
  1170. int st_b = b;
  1171. if(a >= b){
  1172. return;
  1173. }
  1174. aa = (a += N);
  1175. bb = (b += N);
  1176. push(a);
  1177. push(b-1);
  1178. if(a%2){
  1179. sum[a] = mn[a] = val;
  1180. a++;
  1181. st_a += sz;
  1182. }
  1183. if(b%2){
  1184. b--;
  1185. st_b -= sz;
  1186. sum[b] = mn[b] = val;
  1187. }
  1188. a /= 2;
  1189. b /= 2;
  1190. while(a < b){
  1191. sz *= 2;
  1192. if(a%2){
  1193. fixed[a]=1;
  1194. fixval[a]=val;
  1195. sum[a] = sz * val;
  1196. mn[a] = val;
  1197. mnind[a] = st_a;
  1198. a++;
  1199. st_a += sz;
  1200. }
  1201. if(b%2){
  1202. b--;
  1203. st_b -= sz;
  1204. fixed[b]=1;
  1205. fixval[b]=val;
  1206. sum[b] = sz * val;
  1207. mn[b] = val;
  1208. mnind[b] = st_b;
  1209. }
  1210. a /= 2;
  1211. b /= 2;
  1212. }
  1213. build(aa);
  1214. build(bb-1);
  1215. }
  1216. inline void add(int a, int b, T val){
  1217. int sz = 1;
  1218. int aa;
  1219. int bb;
  1220. if(a >= b){
  1221. return;
  1222. }
  1223. aa = (a += N);
  1224. bb = (b += N);
  1225. push(a);
  1226. push(b-1);
  1227. if(a%2){
  1228. sum[a] += val;
  1229. mn[a] += val;
  1230. a++;
  1231. }
  1232. if(b%2){
  1233. b--;
  1234. sum[b] += val;
  1235. mn[b] += val;
  1236. }
  1237. a /= 2;
  1238. b /= 2;
  1239. while(a < b){
  1240. sz *= 2;
  1241. if(a%2){
  1242. if(fixed[a]){
  1243. fixval[a] += val;
  1244. }
  1245. else{
  1246. addval[a] += val;
  1247. }
  1248. sum[a] += sz * val;
  1249. mn[a] += val;
  1250. a++;
  1251. }
  1252. if(b%2){
  1253. b--;
  1254. if(fixed[b]){
  1255. fixval[b] += val;
  1256. }
  1257. else{
  1258. addval[b] += val;
  1259. }
  1260. sum[b] += sz * val;
  1261. mn[b] += val;
  1262. }
  1263. a /= 2;
  1264. b /= 2;
  1265. }
  1266. build(aa);
  1267. build(bb-1);
  1268. }
  1269. inline pair<T,int> getMin(int a, int b){
  1270. pair<T,int> res;
  1271. pair<T,int> tmp;
  1272. int fga = 0;
  1273. int fgb = 0;
  1274. a += N;
  1275. b += N;
  1276. push(a);
  1277. push(b-1);
  1278. while(a < b){
  1279. if(a%2){
  1280. if(fga){
  1281. res =min_L(res, make_pair(mn[a], mnind[a]));
  1282. }
  1283. else{
  1284. res = make_pair(mn[a], mnind[a]);
  1285. fga = 1;
  1286. }
  1287. a++;
  1288. }
  1289. if(b%2){
  1290. b--;
  1291. if(fgb){
  1292. tmp =min_L(make_pair(mn[b], mnind[b]), tmp);
  1293. }
  1294. else{
  1295. tmp = make_pair(mn[b], mnind[b]);
  1296. fgb = 1;
  1297. }
  1298. }
  1299. a /= 2;
  1300. b /= 2;
  1301. }
  1302. if(fga==1 && fgb==0){
  1303. return res;
  1304. }
  1305. if(fga==0 && fgb==1){
  1306. return tmp;
  1307. }
  1308. if(fga==1 && fgb==1){
  1309. res =min_L(res, tmp);
  1310. return res;
  1311. }
  1312. return res;
  1313. }
  1314. inline T getMinVal(int a, int b){
  1315. T res;
  1316. T tmp;
  1317. int fga = 0;
  1318. int fgb = 0;
  1319. a += N;
  1320. b += N;
  1321. push(a);
  1322. push(b-1);
  1323. while(a < b){
  1324. if(a%2){
  1325. if(fga){
  1326. res =min_L(res, mn[a]);
  1327. }
  1328. else{
  1329. res = mn[a];
  1330. fga = 1;
  1331. }
  1332. a++;
  1333. }
  1334. if(b%2){
  1335. b--;
  1336. if(fgb){
  1337. tmp =min_L(mn[b], tmp);
  1338. }
  1339. else{
  1340. tmp = mn[b];
  1341. fgb = 1;
  1342. }
  1343. }
  1344. a /= 2;
  1345. b /= 2;
  1346. }
  1347. if(fga==1 && fgb==0){
  1348. return res;
  1349. }
  1350. if(fga==0 && fgb==1){
  1351. return tmp;
  1352. }
  1353. if(fga==1 && fgb==1){
  1354. res =min_L(res, tmp);
  1355. return res;
  1356. }
  1357. return res;
  1358. }
  1359. inline int getMinInd(int a, int b){
  1360. return getMin(a,b).second;
  1361. }
  1362. inline T getSum(int a, int b){
  1363. T res;
  1364. T tmp;
  1365. int fga = 0;
  1366. int fgb = 0;
  1367. a += N;
  1368. b += N;
  1369. push(a);
  1370. push(b-1);
  1371. while(a < b){
  1372. if(a%2){
  1373. if(fga){
  1374. res = res + sum[a];
  1375. }
  1376. else{
  1377. res = sum[a];
  1378. fga = 1;
  1379. }
  1380. a++;
  1381. }
  1382. if(b%2){
  1383. b--;
  1384. if(fgb){
  1385. tmp = sum[b] + tmp;
  1386. }
  1387. else{
  1388. tmp = sum[b];
  1389. fgb = 1;
  1390. }
  1391. }
  1392. a /= 2;
  1393. b /= 2;
  1394. }
  1395. if(fga==1 && fgb==0){
  1396. return res;
  1397. }
  1398. if(fga==0 && fgb==1){
  1399. return tmp;
  1400. }
  1401. if(fga==1 && fgb==1){
  1402. res = res + tmp;
  1403. return res;
  1404. }
  1405. return res;
  1406. }
  1407. }
  1408. ;
  1409. int TEST;
  1410. int N;
  1411. long long A[100000+1];
  1412. Comb<Modint> c;
  1413. segtree<long long> t;
  1414. Modint solve(int x, int y){
  1415. int z;
  1416. if(x >= y){
  1417. return 1;
  1418. }
  1419. z = t.getMinInd(x, y);
  1420. return solve(x,z) * solve(z+1,y) * c.C(y-x-1, z-x);
  1421. }
  1422. int main(){
  1423. wmem = memarr;
  1424. t.walloc(100000+1);
  1425. int Lj4PdHRW = rd_int();
  1426. for(TEST=(0);TEST<(Lj4PdHRW);TEST++){
  1427. int i;
  1428. wt_L("Case #");
  1429. wt_L(TEST+1);
  1430. wt_L(": ");
  1431. rd(N);
  1432. {
  1433. int e98WHCEY;
  1434. for(e98WHCEY=(0);e98WHCEY<(N);e98WHCEY++){
  1435. rd(A[e98WHCEY]);
  1436. }
  1437. }
  1438. for(i=(1);i<(N);i++){
  1439. if(A[i] > A[i-1]+1){
  1440. wt_L(0);
  1441. wt_L('\n');
  1442. goto KL2GvlyY;
  1443. }
  1444. }
  1445. t.setN(N);
  1446. for(i=(0);i<(N);i++){
  1447. t[i] = A[i] * 1000000000 - i;
  1448. }
  1449. t.build();
  1450. wt_L(solve(0, N));
  1451. wt_L('\n');
  1452. KL2GvlyY:;
  1453. }
  1454. return 0;
  1455. }
  1456. // cLay version 20210405-1
  1457.  
  1458. // --- original code ---
  1459. // int TEST;
  1460. // int N; ll A[1d5+1];
  1461. // Comb<Modint> c;
  1462. // segtree<ll> t;
  1463. //
  1464. // Modint solve(int x, int y){
  1465. // int z;
  1466. // if(x >= y) return 1;
  1467. // z = t.getMinInd(x, y);
  1468. // return solve(x,z) * solve(z+1,y) * c.C(y-x-1, z-x);
  1469. // }
  1470. //
  1471. // {
  1472. // t.walloc(1d5+1);
  1473. // REP(TEST,rd_int()){
  1474. // wtF("Case #{TEST+1}: ");
  1475. // rd(N,A(N));
  1476. // rep(i,1,N) if(A[i] > A[i-1]+1) wt(0), break_continue;
  1477. // t.setN(N);
  1478. // rep(i,N) t[i] = A[i] * 1d9 - i;
  1479. // t.build();
  1480. // wt(solve(0, N));
  1481. // }
  1482. // }
  1483.  
Time limit exceeded #stdin #stdout 5s 5604KB
stdin
Standard input is empty
stdout
Standard output is empty