zoukankan      html  css  js  c++  java
  • [CodeForces

    题目大意:

    两个人玩取数游戏,第一个人分数一开始是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$的项的系数和即可。

    我们可以把分子变形:

    egin{equation}
    egin{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=(1x2k+11x)2t=(1x2k+1)2t×1(1x)2t=(1x2k+1)2t×(1+x+x2+x3+x4+)2t

  • 相关阅读:
    javascript工具--控制台详解(转自 阮一峰博客)
    javascript基础知识--函数定义
    javascript基础知识--什么是构造函数?什么是实例化对象?
    移动端开发,几个你可能不知道的CSS单位属性。
    HTML标签语义化,裸奔都那么帅
    THREE.JS开发《我的世界》(一)
    Webpack + ES6 最新环境搭建与配置
    canvas实现3D魔方
    Canvas实现3D效果-可旋转的立方体
    实现记忆中的经典游戏-扫雷
  • 原文地址:https://www.cnblogs.com/vb4896/p/5871349.html
Copyright © 2011-2022 走看看