#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<set> #include<queue> #include<cmath> usingnamespace std; #define x first #define y second constint SIZE = 2010; pair<int, int> a[SIZE]; int h, w, n, f[SIZE], mod = 1000000007; longlong jc[200010], jcinv[200010];
intC(int n, int m){ return jc[n] * jcinv[m] % mod * jcinv[n - m] % mod; }
longlongpower(longlong a, int b){ longlong c = 1; for (; b; b >>= 1) { if (b & 1) c = c*a%mod; a = a*a%mod; } return c; }
intmain(){ jc[0] = 1, jcinv[0] = 1; for (int i = 1; i <= 200000; i++) { jc[i] = jc[i - 1] * i % mod; jcinv[i] = power(jc[i], mod - 2); } cin >> h >> w >> n; for (int i = 1; i <= n; i++) scanf("%d%d", &a[i].x, &a[i].y); sort(a + 1, a + n + 1); a[n + 1].x = h, a[n + 1].y = w; for (int i = 1; i <= n + 1; i++) { f[i] = C(a[i].x + a[i].y - 2, a[i].x - 1); for (int j = 1; j < i; j++) { if (a[j].x > a[i].x || a[j].y > a[i].y) continue; f[i] = (f[i] - (longlong)f[j] * C(a[i].x + a[i].y - a[j].x - a[j].y, a[i].x - a[j].x)) % mod; } } cout << (f[n + 1] + mod) % mod << endl; }
//Author:XuHt #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long usingnamespace std; constint N = 60, S = 600; int n; structA { int a[S], len; inline A operator / (constint x) const { A ans; memset(ans.a, 0, sizeof(ans.a)); ans.len = 0; int num = 0; for (int i = len; i; i--) { num = num * 10 + a[i]; ans.a[i] = num / x; num %= x; if (!ans.len && ans.a[i]) ans.len = i; } return ans; } inline A operator + (const A x) const { A ans; memset(ans.a, 0, sizeof(ans.a)); for (int i = 1; i <= max(len, x.len); i++) { ans.a[i] += a[i] + x.a[i]; ans.a[i+1] = ans.a[i] / 10; ans.a[i] %= 10; } ans.len = max(len, x.len); if (ans.a[ans.len+1]) ++ans.len; return ans; } inline A operator * (const A x) const { A ans; memset(ans.a, 0, sizeof(ans.a)); for (int i = 1; i <= len; i++) for (int j = 1; j <= x.len; j++) { ans.a[i+j-1] += a[i] * x.a[j]; ans.a[i+j] += ans.a[i+j-1] / 10; ans.a[i+j-1] %= 10; } ans.len = len + x.len - 1; if (ans.a[ans.len+1]) ++ans.len; return ans; } } f[N], p[N];
inline A C(int x, int y){ A ans; ans.len = ans.a[1] = 1; for (int i = y, j = 1; j <= x; i--, j++) { int t = i; A tmp; tmp.len = 0; while (t) { tmp.a[++tmp.len] = t % 10; t /= 10; } ans = ans * tmp / j; } return ans; }
inlinevoidprint(A x){ for (int i = x.len; i; i--) printf("%d", x.a[i]); puts(""); }
intmain(){ for (int i = 1; i <= 50; i++) { ll t = (1ll << i) - 1; while (t) { p[i].a[++p[i].len] = t % 10; t /= 10; } } f[1].len = f[2].len = f[1].a[1] = f[2].a[1] = 1; for (int i = 3; i <= 50; i++) for (int j = 1; j <= i - 1; j++) f[i] = f[i] + C(j - 1, i - 2) * f[j] * f[i-j] * p[j]; while (cin >> n && n) print(f[n]); return0; }
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> usingnamespace std; int t, n; longlong m, f[21][21][2];
voidprework(){ f[1][1][0] = f[1][1][1] = 1; for (int i = 2; i <= 20; i++) for (int j = 1; j <= i; j++) { for (int p = j; p <= i - 1; p++) f[i][j][0] += f[i - 1][p][1]; for (int p = 1; p <= j - 1; p++) f[i][j][1] += f[i - 1][p][0]; } }
intmain() { prework(); cin >> t; while (t--) { cin >> n >> m; bool used[21]; memset(used, 0, sizeof(used)); int last, k; // 第1块木板,既可能处于高位,也可能处于低位,单独处理 for (int j = 1; j <= n; j++) { if (f[n][j][1] >= m) { last = j, k = 1; break; } else m -= f[n][j][1]; if (f[n][j][0] >= m) { last = j, k = 0; break; } else m -= f[n][j][0]; } used[last] = 1; printf("%d", last); // 第2~n块木板,高低位置、合法的长度范围与上一块木板有关 for (int i = 2; i <= n; i++) { k ^= 1; // 真实长度为len,在剩余木板中排名为j int j = 0; for (int len = 1; len <= n; len++) { if (used[len]) continue; j++; if (k == 0 && len < last || k == 1 && len > last) { if (f[n - i + 1][j][k] >= m) { last = len; break; } else m -= f[n - i + 1][j][k]; } } used[last] = 1; printf(" %d", last); } puts(""); } }