zoukankan      html  css  js  c++  java
  • 2018 “百度之星”程序设计大赛

    度度熊看球赛

    Problem Description
    世界杯正如火如荼地开展!度度熊来到了一家酒吧。

    有 N 对情侣相约一起看世界杯,荧幕前正好有 2×N 个横排的位置。

    所有人都会随机坐在某个位置上。

    当然,如果某一对情侣正好挨着坐,他们就会有说不完的话,影响世界杯的观看。

    一般地,对于一个就座方案,如果正好有 K 对情侣正好是挨着坐的,就会产生 DK 的喧闹值。

    度度熊想知道随机就座方案的期望喧闹值。

    为了避免输出实数,设答案为 ans,请输出 ans×(2N)! mod P 的值。其中 P=998244353

    Input
    有多组数据(不超过 1000 组),读到EOF结束。

    对于每一组数据,读入两个数 N 和 D 。

    1≤N,D≤1000

    Output
    对于每一组数据,输出一个数表示答案。

    Sample Input

    1 10
    2 3

    Sample Output

    20
    104

    题解:
    官方题解其实已经解释得很好了,这样 dp 的确很巧妙。

    dp[i][j] 表示前 i 对情侣,有 j 对坐在一起的方案数。
    首先为了简便,我们把每对情侣中两个人看作是相同的两个人,最后乘上 2^n 即可。
    最后要求 ans×(2N)!,也就是求出 i 对情侣坐位所有不同方案数。
    然后由前 i 对递推转移到前 i+1 对 :
    1、第 i+1 对在一起:
    (1)第 i+1 对插入进另一对中间, dp[i+1][j] += dp[i][j] * j ;
    (2)第 i+1 对不插入另一对中间,dp[i+1][j+1] += dp[i][j] * (2*i+1-j) ;
    2、第 i+1 对不在一起:
    (1)第 i+1 对的两个人分别插入另外两对中间,dp[i+1][j-2] += dp[i][j] * C(j,2) ;
    (2)第 i+1 对的两个人只有一个人插入到另一对中间,dp[i+1][j-1] += dp[i][j] * C(j,1) ;
    (3)第 i+1 对的两个人都不插入其它对里,dp[i+1][j] += dp[i][j] * C(2*i+1-j, 2) ;

    代码懒得写了_

  • 相关阅读:
    Base64原理与实现
    Oracle中rownum用法警示
    实例游戏内存修改器----CUI版本模拟
    Win32进程创建、进程快照、进程终止用例
    pThreads线程(三) 线程同步--条件变量
    pThreads线程(二) 线程同步--互斥量/锁
    pThreads线程(一) 基本API
    VS调试快捷键
    运行程序报“应用程序配置不正确”或者缺少运行库造成程序不可移植的问题
    C++模拟键盘消息
  • 原文地址:https://www.cnblogs.com/sbfhy/p/9464047.html
Copyright © 2011-2022 走看看