fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6. #define maxn 100005
  7. #define FOR(i , a , b) for(int i = a ; i <= b; i++)
  8. #define FAST ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  9. #define REVERSE(i , a , b) for(int i = a ; i >= b; i--)
  10.  
  11. const ll MOD = 1e9 + 7;
  12.  
  13. ll ifact[2 * maxn] , fact[2 * maxn];
  14.  
  15. ll binpow(ll a , ll b , ll c){
  16. ll res = 1;
  17. while(b){
  18. if(b & 1){
  19. res *= a;
  20. res %= c;
  21. }
  22. a *= a;
  23. a %= c;
  24. b >>= 1;
  25. }
  26.  
  27. return res;
  28. }
  29.  
  30. ll mod_inverse(ll a , ll m){
  31. return binpow(a , MOD - 2 , MOD);
  32. }
  33.  
  34. void precompute(){
  35. fact[0] = 1;
  36. FOR(i , 1 , 2 * maxn){
  37. fact[i] = fact[i - 1] * i;
  38. fact[i] %= MOD;
  39. }
  40.  
  41. ifact[2 * maxn] = mod_inverse(fact[2 * maxn] , MOD);
  42.  
  43. REVERSE(i , 2 * maxn - 1 , 0){
  44. ifact[i] = ifact[i + 1] * (i + 1);
  45. ifact[i] %= MOD;
  46. }
  47. }
  48.  
  49. ll nCk(ll n , ll k){
  50. if(k < 0 || k > n) return 0;
  51. return ((fact[n] * ifact[n - k]) % MOD) * ifact[k] % MOD;
  52. }
  53.  
  54.  
  55. struct Point{
  56. ll x , y;
  57. };
  58.  
  59. bool cmp(Point &a , Point &b){
  60. if(a.x != b.x) return a.x < b.x;
  61. return a.y < b.y;
  62. }
  63.  
  64. Point nanh_cuti[100005];
  65.  
  66. ll dp[100005];
  67.  
  68. int main(){
  69. FAST;
  70. int n , m , k;
  71. cin >> n >> m >> k;
  72. precompute();
  73. FOR(i , 1 , k){
  74. cin >> nanh_cuti[i].x >> nanh_cuti[i].y;
  75. }
  76.  
  77. k = k + 1;
  78. nanh_cuti[k].x = n;
  79. nanh_cuti[k].y = m;
  80. sort(nanh_cuti + 1 , nanh_cuti + k + 1 , cmp);
  81.  
  82. FOR(i , 1 , k){
  83. dp[i] = nCk(nanh_cuti[i].x + nanh_cuti[i].y - 2 , nanh_cuti[i].x - 1);
  84. dp[i] %= MOD;
  85. FOR(j , 1 , i - 1){
  86. if(nanh_cuti[j].x <= nanh_cuti[i].x && nanh_cuti[j].y <= nanh_cuti[i].y){
  87. ll dx = nanh_cuti[i].x - nanh_cuti[j].x;
  88. ll dy = nanh_cuti[i].y - nanh_cuti[j].y;
  89. dp[i] = (dp[i] - dp[j] * nCk(dx + dy , dx) % MOD + MOD) % MOD;
  90. dp[i] %= MOD;
  91. }
  92. }
  93. }
  94.  
  95. cout << dp[k];
  96. }
  97.  
Success #stdin #stdout 2.44s 7760KB
stdin
Standard input is empty
stdout
Standard output is empty