D. New Year and Arbitrary Arrangement

分析

\(dp[i][j]\) 表示已有 \(i\) 个 \(a\) 和 \(j\) 个 \(ab\) 的情况下继续构造能得到的 \(ab\) 个数的期望。

考虑 DFS 记忆化搜索。

有两个要注意的地方:

令 \(p_a\) 为添加 \(a\) 的概率,\(p_b\) 为添加 \(b\) 的概率。

  1. 当 \(i + j \geq k\) 时,这个情况下添加一个 \(b\) 构造就停止了,但是在这个 \(b\) 之前显然可以无限添加 \(a\) ,这后面的期望为 \((i + j) * p_b + p_a*(i+j+1)*p_b+p_a^2*(i+j+2)*p_b+...\) 这个式子可以化简,\(O(1)\) 计算。
  2. 起始状态应该是 \(dp[0][0] = dp[1][0] * p_a + dp[0][0] * p_b\) ,\(dp[0][0] * p_b\) 说明我们可以不断添加前导 \(b\) 。可以发现 \(dp[0][0] = (p_b^0+p_b^1+p_b^2...) * dp[1][0] * p_a=\frac{1}{1-p_b}*dp[1][0]*p_a=dp[1][0]\),所以我们可以直接计算一个以 \(a\) 开头的序列 ,即计算 \(dp[1][0]\) 。

code

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MOD = 1e9 + 7;
  4. long long POW(long long x, int k) {
  5. long long ret = 1;
  6. while(k) {
  7. if(k & 1) ret = (ret * x) % MOD;
  8. x = x * x % MOD;
  9. k >>= 1;
  10. }
  11. return ret;
  12. }
  13. long long k, pa, pb, dp[1001][1001];
  14. long long dfs(int a, int ab) {
  15. if(a + ab >= k) return a + ab + pa * POW(pb, MOD - 2) % MOD;
  16. if(dp[a][ab] != -1) return dp[a][ab];
  17. return dp[a][ab] = (dfs(a + 1, ab) * pa % MOD + dfs(a, ab + a) * pb % MOD) * POW(pa + pb, MOD - 2) % MOD;
  18. }
  19. int main() {
  20. memset(dp, -1, sizeof dp);
  21. cin >> k >> pa >> pb;
  22. long long p = __gcd(pa, pb);
  23. pa /= p;
  24. pb /= p;
  25. cout << dfs(1, 0) << endl;
  26. return 0;
  27. }

E. New Year and Entity Enumeration

分析

官方题解 很详细了,自己补充几点。

  1. 考虑 \(m\) 个二进制数,假设 \(m=4\) ,那么有 0001,0010,0100,1000 。这些数一定是某一二进制位有 \(1\) 的最小的数,用 \(f\) 表示这个关系。\(f[0]=0001\),\(f[1]=0010\) ... 。这些数中任意两个数按位与后都为 \(0\) ,那么可以考虑求这个集合划分方法的数目,即贝尔数 ,将各个子集中的数分别按位或起来,举个例子 1000,0100,0011 。这种情况下,第一位和第二位为 \(1\) 的二进制数都是 0011 ,可以发现,各种划分方案中我们得到的 \(f\) 并不会完全相同,所以用这个划分方案数就对应着 \(m\) 位二进制数的解(具体可见官方题解的证明)。
  2. 题目要求 \(T\) 是 \(S\) 的子集。以样例为例,

    11010

    00101

    11000

    竖着去看,有两个 101 两个 010 一个 100 。考虑两个 101 ,我们再横着去看,即 00 11 00 ,我们知道一个 \(k\) 进制数的任意一种方案一定包括 \(k\) 个 \(0\) 和 \(k\) 个 \(1\) 这两个二进制数,我们分开去求一定可以得到满足题目的方案,若 \(b[i]\) 为贝尔数,那么这个答案就是 \(b[2] * b[2] * b[1]\)。

code

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e3 + 10;
  4. const int MOD = 1e9 + 7;
  5. long long C[N][N];
  6. map<long long, int> mp;
  7. long long a[N], b[N], c[N][N];
  8. int main() {
  9. for(int i = 0; i < N; i++) {
  10. C[i][0] = 1;
  11. for (int j = 1; j <= i; j++) {
  12. C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;
  13. }
  14. }
  15. int n, m;
  16. cin >> m >> n;
  17. while(n--) {
  18. long long y = 0;
  19. for (int i = 0; i < m; i++) {
  20. long long x;
  21. scanf("%1lld", &x);
  22. a[i] |= x << n;
  23. }
  24. }
  25. for (int i = 0; i < m; i++) {
  26. mp[a[i]]++;
  27. }
  28. b[0] = b[1] = 1;
  29. for (int i = 2; i <= m; i++) {
  30. for (int j = 0; j < i; j++) {
  31. (b[i] += C[i - 1][j] * b[i - j - 1]) %= MOD;
  32. }
  33. }
  34. long long ans = 1;
  35. for(auto it : mp) {
  36. (ans *= b[it.second]) %= MOD;
  37. }
  38. cout << ans << endl;
  39. return 0;
  40. }

F. New Year and Rainbow Roads

分析

以 G 为间隔分组,每个组内单独讨论,要满足题目条件有两种连法:

  1. 两个 G 不直接相连,通过连接 B 间接连上,也要通过连接 R 间接连上,花费为两倍两个 G 直接的距离。
  2. 两个 G 直接相连,那么 B 全部连上的话就成了一个环了,考虑去掉花费最大的一条边,R 类似。

code

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int preg, prer, preb, fr, lr, fb, lb, mxr, mxb;
  4. int main() {
  5. int n;
  6. cin >> n;
  7. long long ans = 0;
  8. for (int i = 0; i < n; i++) {
  9. int p;
  10. char c[2];
  11. scanf("%d%s", &p, c);
  12. if(c[0] == 'G') {
  13. if(prer) mxr = max(mxr, p - prer);
  14. if(preb) mxb = max(mxb, p - preb);
  15. if(!preg) { // 第一个 G 前面
  16. if(fr) {
  17. ans += p - fr;
  18. }
  19. if(fb) {
  20. ans += p - fb;
  21. }
  22. } else { // 两个 G 之间
  23. ans += min(2LL * (p - preg), 3LL * (p - preg) - mxb - mxr);
  24. }
  25. prer = p;
  26. preb = p;
  27. preg = p;
  28. lb = lr = p;
  29. mxb = mxr = 0;
  30. } else if(c[0] == 'B') {
  31. if(!fb) fb = p;
  32. if(preb) mxb = max(mxb, p - preb);
  33. preb = p;
  34. lb = p;
  35. } else if(c[0] == 'R') {
  36. if(!fr) fr = p;
  37. if(prer) mxr = max(mxr, p - prer);
  38. prer = p;
  39. lr = p;
  40. }
  41. }
  42. if(!preg) {
  43. if(lr != fr) ans += lr - fr;
  44. if(lb != fb) ans += lb - fb;
  45. } else {
  46. ans += lr - preg;
  47. ans += lb - preg;
  48. }
  49. cout << ans << endl;
  50. return 0;
  51. }

G. New Year and Original Order

分析

\(dp[i][j][k][o]\) 表示前 \(i\) 个数中有 \(j\) 个大于等于 \(k\) 的数时的构数方案数,\(o\) 为了保证边界,构造的数不大于 \(X\)。

举个例子,比方说一个数 \(3312\) 我们要累积这个数对答案的贡献,实际上是 \(1233\) ,大于等于 \(1\) 的数有 \(4\) 个,我们可以认为贡献了 \(1111\) ,大于等于 \(2\) 的数有 \(3\) 个,贡献了 \(111\) ,大于等于 \(3\) 的数有 \(2\) 个,贡献了 \(11\) 。

最后枚举 \(k\),累计计算一下答案即可。

code

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MOD = 1e9 + 7;
  4. const int N = 707;
  5. char s[N];
  6. int dp[N][N][10][2];
  7. int main() {
  8. scanf("%s", s + 1);
  9. int n = strlen(s + 1);
  10. for (int i = 1; i < 10; i++) {
  11. dp[0][0][i][0] = 1;
  12. }
  13. for (int i = 0; i < n; i++) {
  14. for (int j = 0; j <= i; j++) {
  15. for (int k = 1; k < 10; k++) {
  16. for (int o = 0; o < 2; o++) {
  17. for (int p = 0; p <= (!o ? s[i + 1] - '0' : 9); p++) {
  18. (dp[i + 1][j + (p >= k)][k][o | p < s[i + 1] - '0'] += dp[i][j][k][o]) %= MOD;
  19. }
  20. }
  21. }
  22. }
  23. }
  24. long long ans = 0;
  25. for(int k = 1; k < 10; k++) {
  26. for (long long i = 1, p = 1; i <= n; i++, p = (p * 10 + 1) % MOD) {
  27. (ans += p * (dp[n][i][k][0] + dp[n][i][k][1]) % MOD) %= MOD;
  28. }
  29. }
  30. printf("%I64d\n", ans);
  31. return 0;
  32. }

Good Bye 2017 部分题解的更多相关文章

  1. Good Bye 2017 A B C

    Good Bye 2017 A New Year and Counting Cards 题目链接: http://codeforces.com/contest/908/problem/A 思路: 如果 ...

  2. Codeforces:Good Bye 2018(题解)

    Good Bye 2018! 题目链接:https://codeforces.com/contest/1091 A. New Year and the Christmas Ornament 题意: 给 ...

  3. Hello 2018, Bye 2017

    2017年过去了,过去一年经历了太多,改变了好多好多,可以说人生进入了另一个阶段,有可能是成熟吧. 回顾2017 去年换了新工作,离开了将近工作了8年的公司,不带走一丝云彩,为其任劳任怨,最后没有任何 ...

  4. Good Bye 2017 D. New Year and Arbitrary Arrangement

    看了别人的题解 首先这题是一个dp dp[i][j] i是当前有多少个a j是当前有多少个ab子序列 dp[i][j] = dp[i+1][j]*Pa + dp[i][i+j]*Pb; i,j 时加一 ...

  5. JXOI 2017 简要题解

    「JXOI2017」数列 题意 九条可怜手上有一个长度为 \(n\) 的整数数列 \(r_i\) ,她现在想要构造一个长度为 \(n\) 的,满足如下条件的整数数列 \(A\) : \(1\leq A ...

  6. Good Bye 2017(送命场)

    9815人数场,9500+围观神仙打架...断断续续打Codeforces也快有一年啦,第一次打Good Bye场,满怀前排膜tourist的心愿参加了这场送命场,虽然没看到tourist.不过还是得 ...

  7. 【Good Bye 2017 C】 New Year and Curling

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举前i-1个圆. 哪些圆和它相交. 取圆心纵坐标最大的那个圆就可以了. [代码] #include <bits/stdc++ ...

  8. 【Good Bye 2017 B】 New Year and Buggy Bot

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举一下全排列.看看有多少种可以到达终点即可. [代码] #include <bits/stdc++.h> using ...

  9. 【Good Bye 2017 A】New Year and Counting Cards

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 是元音字母或者是奇数就递增. [代码] #include <bits/stdc++.h> using namespace ...

随机推荐

  1. CSS3之伪元素选择器和伪类选择器

    伪类选择器,和一般的DOM中的元素样式不一样,它并不改变任何DOM内容.只是插入了一些修饰类的元素,这些元素对于用户来说是可见的,但是对于DOM来说不可见.伪类的效果可以通过添加一个实际的类来达到. ...

  2. 【BZOJ】1572: [Usaco2009 Open]工作安排Job

    [题意]给定n项工作的截止时间和价值,每项工作需要1单位时间完成,求最大价值.n<=10^5. [算法]贪心+堆 [题解] 如果是访问到x时将d[x]前的点从价值最大的能加就加是错误的贪心,因为 ...

  3. Intersection(HDU5120 + 圆交面积)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5120 题目: 题意: 求两个圆环相交的面积. 思路: 两个大圆面积交-2×大圆与小圆面积交+两小圆面 ...

  4. spark作业提交参数设置(转)

    来源:https://www.cnblogs.com/arachis/p/spark_parameters.html 摘要 1.num-executors 2.executor-memory 3.ex ...

  5. mysq配置

    mysql运维 1.mysql配置文件:/etc/my.cnf mysql日记文件 :安装时候配置的,可以通过ps aux|grep mysqld 查询 ps aux|grep mysqld mysq ...

  6. Linux下用到数据库sqlite3

    最近在Linux下用到数据库sqlite3,于是开始了该方面的学习. 0. 引言 我们这篇文章主要讲述了如何在C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理, 包括创建数据库.创建 ...

  7. PGSql

    http://www.yiibai.com/postgresql/ http://www.postgresql.org/ http://blog.csdn.net/wulex/article/deta ...

  8. Linux 基础——权限管理命令chown、chgrp

    一.chown命令与chgrp命令的作用 有时你需要改变文件或目录的属主,比如有人离职或开发人员创建了一个在测试或生产环境中需要归属在系统账户下的应用.Linux提供了两个命令来实现这个功能:chow ...

  9. Windows内核执行体对象管理器的操作过程与分析

    我之前写过一个有关于对象管理的读书笔记.但是这篇文章与前面的不同,这是我个人对对象管理器到底是什么的一个分析,而且也是直接对WRK代码进行的阅读. 执行体对象即我们通常所言的内核对象,我们知道Wind ...

  10. 分子量(UVa1586)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=830&a ...