[关闭]
@yuyuesheng 2019-02-22T21:40:36.000000Z 字数 1280 阅读 828

G - Cheerleaders

题意:
要将k个棋子放到n*m的棋盘上,求要求第一行,第一列,最后一行,最后一列必须要有棋子,问有几种放法。
题解:
一共16种状态,枚举每一种状态进行计算。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. using namespace std;
  5. const int mod = 1000007;
  6. const int maxn = 510;
  7. int c[maxn][maxn];
  8. int n, m, k;
  9. void init() {
  10. c[0][0] = 1;
  11. for (int i = 0; i <= maxn; i++) {
  12. c[i][0] = c[i][i] = 1;
  13. for (int j = 0; j < i; j++) {
  14. c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
  15. }
  16. }
  17. }
  18. int main() {
  19. init();
  20. int t;
  21. int cas = 1;
  22. cin >> t;
  23. while (t--) {
  24. int ans = 0;
  25. cin >> n >> m >> k;
  26. for (int s = 0; s < 16; s++) {
  27. int a = n;
  28. int b = m;
  29. int cnt = 0;
  30. if (s&(1 << 0)) {
  31. a--;
  32. cnt++;
  33. }
  34. if (s&(1 << 1)) {
  35. a--;
  36. cnt++;
  37. }
  38. if (s&(1 << 2)) {
  39. b--;
  40. cnt++;
  41. }
  42. if (s&(1 << 3)) {
  43. b--;
  44. cnt++;
  45. }
  46. if (cnt % 2)
  47. ans = (ans + mod - c[a * b][k]) % mod;
  48. else
  49. ans = (ans + c[a * b][k]) % mod;
  50. }
  51. cout << "Case " << cas++<<": " << ans << endl;
  52. }
  53. return 0;
  54. }

H - Arrange the Numbers

题意:
n个数中刚好固定前m个数中的k个数的位置,问你有多少中排列方案。
题解:
利用错排的思想计算剩下的数的排列方案数

  1. #include<iostream>
  2. using namespace std;
  3. typedef long long ll;
  4. const int mod = 1e9+7;
  5. int n, m, k;
  6. ll c[1010][1010], d[1010];
  7. void init() {
  8. c[0][0] = 1;
  9. c[1][0] = c[1][1] = 1;
  10. for (int i = 2; i < 1010; i++) {
  11. c[i][0] = c[i][i] = 1;
  12. for (int j = 1; j < i; j++) {
  13. c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
  14. }
  15. }
  16. d[0] = 1;
  17. d[1] = 0;
  18. d[2] = 1;
  19. for (int i = 3; i < 1010; i++) {
  20. d[i] = (i - 1) * (d[i - 1] + d[i - 2]) % mod;
  21. }
  22. }
  23. ll solve() {
  24. ll ans = 0;
  25. for (int i = 0; i <= n - m; i++) {
  26. ans += c[n - m][i] * d[n - k - i] % mod;
  27. ans %= mod;
  28. }
  29. return c[m][k] * ans % mod;
  30. }
  31. int main() {
  32. int cas;
  33. init();
  34. cin >> cas;
  35. for (int c = 1; c <= cas; c++) {
  36. cin >> n >> m >> k;
  37. cout << "Case " << c << ": " << solve() << endl;
  38. }
  39. return 0;
  40. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注