向上跳,再向上跳,也许再努力一点我就能够着菊苣们的膝盖了。
——题记
7.23
CodeForces 559C 组合数 + DP
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <map> 5 #define MP make_pair 6 #define F first 7 #define S second 8 using namespace std; 9 10 typedef long long LL; 11 typedef pair<LL, LL> Point; 12 13 const int maxn = 22000 + 10; 14 const LL MOD = 1000000007LL; 15 16 inline LL mul_mod(LL a, LL b) 17 { 18 a %= MOD; b %= MOD; 19 return (a * b) % MOD; 20 } 21 22 inline LL sub_mod(LL a, LL b) 23 { 24 return (((a - b) % MOD) + MOD) % MOD; 25 } 26 27 LL pow_mod(LL a, LL n) 28 { 29 LL ans = 1; 30 while(n) 31 { 32 if(n & 1) ans = mul_mod(ans, a); 33 a = mul_mod(a, a); 34 n >>= 1; 35 } 36 return ans; 37 } 38 39 LL Inverse(LL a) 40 { return pow_mod(a, MOD - 2); } 41 42 const int maxh = 200000 + 10; 43 44 LL fac[maxh], invfac[maxh]; 45 46 void init() 47 { 48 fac[0] = fac[1] = 1; 49 for(int i = 2; i < maxh; i++) fac[i] = mul_mod(fac[i-1], i); 50 invfac[maxh-1] = Inverse(fac[maxh-1]); 51 for(int i = maxh-2; i >= 0; i--) invfac[i] = mul_mod(invfac[i+1], i+1); 52 } 53 54 LL C(LL n, LL m) 55 { 56 if(m > n) { puts("shakalaka"); return 0; } 57 return mul_mod(mul_mod(fac[n], invfac[m]), invfac[n-m]); 58 } 59 60 int h, w, n; 61 62 Point a[maxn]; 63 64 LL methods(int i, int j) 65 { 66 LL x = a[j].first - a[i].first; 67 LL y = a[j].second - a[i].second; 68 return C(x + y, x); 69 } 70 71 LL dp[maxn]; 72 73 int main() 74 { 75 //freopen("in.txt", "r", stdin); 76 77 init(); 78 scanf("%d%d%d", &h, &w, &n); 79 for(int i = 1; i <= n; i++) 80 { 81 LL x, y; scanf("%I64d%I64d", &x, &y); 82 a[i] = MP(x, y); 83 } 84 sort(a + 1, a + n + 1); 85 a[0] = MP(1, 1); 86 a[n+1] = MP(h, w); 87 dp[1] = methods(0, 1); 88 89 for(int i = 2; i <= n + 1; i++) 90 { 91 dp[i] = methods(0, i); 92 for(int j = 1; j < i; j++) if(a[j].F <= a[i].F && a[j].S <= a[i].S) 93 dp[i] = sub_mod(dp[i], mul_mod(methods(j, i), dp[j])); 94 } 95 96 printf("%I64d\n", dp[n + 1]); 97 98 return 0; 99 }