题目大意:

两个人玩取数游戏,第一个人分数一开始是a,第二个分数一开始是b,接下来t轮,每轮两人都选择一个[-k,k]范围内的整数,加到自己的分数里,求有多少种情况使得t轮结束后a的分数比b高。  (1 ≤ a, b ≤ 100, 1 ≤ k ≤ 1000, 1 ≤ t ≤ 100)

1.我一开始的想法是DP出玩i轮得分是j的方案数。然后状态数最多有t*(2*k*t)那么多,最坏情况下会有2e7那么多的状态,转移必须是O(1)的。

dp[i][j]=sum(dp[i-1][j-k....j+k])用个前缀和维护即可。 最后求答案的时候傻逼了,觉得必须枚举最后两人的得分,就放弃了这个做法。后来看了别人的题解,其实只要枚举第一个人的最后得分,那么第二个人可行的得分是连续的一段区间,也可以用前缀和来优化。    以上记为方法一。  时间复杂度O(k*t2)

2.方法二:一个重要的转化,原题等价于一个人一开始得分是a-b,然后玩2*t轮,最后得分要求大于0的方案数。  然后就和方法一一样了。

3.方法三:利用生成函数。观察可知  $(\frac{1+x+x^2+x^3+\cdots+x^{2k}}{x^k})^{2t}$次数大于0的项的系数和即为答案。 我们只要求出分子$(1+x+x^2+x^3+\cdots+x^{2k})^{2t}$的所有次数大于$2kt$的项的系数和即可。

我们可以把分子变形:

\begin{equation}
\begin{array}{rcl}
  (1+x+x^2+x^3+\cdots+x^{2k})^{2t}&=&(1-x^{2k+1})^{2t}(\frac{1}{1-x})^{2t}\\
                      &=&\sum_{i=0}^{2t}C_{_{2t}}^{^i}(-1)^{i}x^{(2k+1)i} \sum_{j=0}^{\infty}C_{_{2t-1+j}}^{^{2t-1}}\ \ \ \ x^j
  \end{array}
\end{equation}

 
我们可以枚举前面一个和式中的i,然后确定j的范围。 注意j其实是有上界的,因为分析可知这个式子的最高次数是$4kt$次。
因此$0<(2k+1)i+j<=4kt$  解出j的范围是连续的,可以利用组合数的性质合并。 时间复杂度可以做到O(kt)

(1+x+x2+⋯+x2k)2t=(1−x2k+11−x)2t=(1−x2k+1)2t×1(1−x)2t=(1−x2k+1)2t×(1+x+x2+x3+x4+⋯)2t

[CodeForces - 712D]Memory and Scores (DP 或者 生成函数)的更多相关文章

  1. CodeForces 712D Memory and Scores

    $dp$,前缀和. 记$dp[i][j]$表示$i$轮结束之后,两人差值为$j$的方案数. 转移很容易想到,但是转移的复杂度是$O(2*k)$的,需要优化,观察一下可以发现可以用过前缀和来优化. 我把 ...

  2. Codeforces Round #370 (Div. 2) D. Memory and Scores DP

    D. Memory and Scores   Memory and his friend Lexa are competing to get higher score in one popular c ...

  3. Codeforces 712 D. Memory and Scores (DP+滚动数组+前缀和优化)

    题目链接:http://codeforces.com/contest/712/problem/D A初始有一个分数a,B初始有一个分数b,有t轮比赛,每次比赛都可以取[-k, k]之间的数,问你最后A ...

  4. Codeforces Round #370 (Div. 2) D. Memory and Scores 动态规划

    D. Memory and Scores 题目连接: http://codeforces.com/contest/712/problem/D Description Memory and his fr ...

  5. [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)

    [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...

  6. [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列)

    [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列) 题面 两个人玩游戏,共进行t轮,每人每轮从[-k,k]中选出一个数字,将其加到自己的总分中.已 ...

  7. Memory and Scores

    Memory and Scores 题目链接:http://codeforces.com/contest/712/problem/D dp 因为每轮Memory和Lexa能取的都在[-k,k],也就是 ...

  8. 【26.87%】【codeforces 712D】Memory and Scores

    time limit per test2 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...

  9. Codeforces 438E The Child and Binary Tree [DP,生成函数,NTT]

    洛谷 Codeforces 思路 看到计数和\(998244353\),可以感觉到这是一个DP+生成函数+NTT的题. 设\(s_i\)表示\(i\)是否在集合中,\(A\)为\(s\)的生成函数,即 ...

随机推荐

  1. iOS解决NSData转NSString后字符为空

    iOS中,将NSData转NSString的一般方法为[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];但是当dat ...

  2. Linux系统下安装Mysql

    原文档地址:http://www.itpub.net/thread-1766546-1-1.html 1.在Linux服务器上通过wget命令取得rpm包: wget –c http://dev.my ...

  3. 使用Maven JGit-Flow Plugin

    git flow 请参考 http://www.ituring.com.cn/article/56870 2.开始使用插件,在pom.xml中添加以下代码: https://bitbucket.org ...

  4. 慕课网__css3__3D

  5. DataTable转换为Json字符串的三种方法

    //第一种:使用StringBuilder  public string DataTableToJson(DataTable table) { var JsonString = new StringB ...

  6. /boot/grub/device.map【设备映射】

    grub-install 安装 GRUB 在第一个硬盘的 MBR: # grub-install '(hd0)' grub-install 会先搜寻设备对应的文件(/boot/grub/device. ...

  7. HDFS 核心原理

    HDFS 核心原理 2016-01-11 杜亦舒 HDFS(Hadoop Distribute File System)是一个分布式文件系统文件系统是操作系统提供的磁盘空间管理服务,只需要我们指定把文 ...

  8. npm install报错Error: ENOENT

    E:\projects\ueditor\ueditor1_4_3_3-src>npm installError: ENOENT, stat 'C:\Users\Lucas\AppData\Roa ...

  9. Mysql 启动错误:the server quit without updating pid

    接到任务看看mysql为啥起不来,就上服务器上看了看,确实起不来,至于之前发生了啥也不知道. 服务器Ubuntu,mysql-5.6 1.先试下mysql登陆 mysql -uroot -p 发现报错 ...

  10. 查找数组中重复项的index

    var ary = [5, 4, 4, 2, 7, 8, 33, 2222, 99, 88]; function isRepeat(arr) { var hash = {}; for (var i=0 ...