ARC 124 E Pass to Next

  • problem
  • solution
  • code

problem

题目链接

solution

令 ci:c_i:ci​: 第 iii 个人传给下一个人球的个数

当 min⁡{ci}≠0\min\{c_i\}\neq 0min{ci​}​=0 时,将每一个 cic_ici​ 都减小 111,显然答案序列并不会改变

所以,我们只需要考虑 min⁡{ci}=0\min\{c_i\}=0min{ci​}=0 的情况

这样性质的 ccc 序列一共有 ∏i=1n(ai+1)−∏i=1nai\prod_{i=1}^n(a_i+1)-\prod_{i=1}^na_i∏i=1n​(ai​+1)−∏i=1n​ai​ 种,每一种都会导致最后不同的结果序列

至少有一个人是不传球的方案数:总方案数−-−每个人都传球的方案数(将 +1+1+1 看作不传球)

∏i=1nxi=∏i=1n(xi1):\prod_{i=1}^nx_i=\prod_{i=1}^n\binom{x_i}{1}:∏i=1n​xi​=∏i=1n​(1xi​​): 理解成每个人传完球后,从手里剩下的球中选一个的方案数

所以,我们就可以设计 dpi,0/1dp_{i,0/1}dpi,0/1​ 转移了

  • dpi,0:dp_{i,0}:dpi,0​: 第 iii 个人从自己原有的球上选一个,前 i−1i-1i−1 个人的方案数
  • dpi,1:dp_{i,1}:dpi,1​: 第 iii 个人从第 i−1i-1i−1 个人给的球中选一个,前 iii 个人的方案数

因为是同时一起给下一个人球的,所以每个人手中原本的球可以看成时一种来源,不同来源球直接的分配是相互独立的,前一个人传递过来多少与自己传递多少出去是互不干扰的

  • dpi+1,0←dpi,0⋅ai(ai+1)2dp_{i+1,0}\leftarrow dp_{i,0}·\frac{a_i(a_i+1)}{2}dpi+1,0​←dpi,0​⋅2ai​(ai​+1)​

    由于 dpi,0dp_{i,0}dpi,0​ 没有算 iii 的贡献,转移时要加上;且这种情况 iii 时从自己手上剩的球中选一个

    如果剩下 xxx 个就有 xxx 种选法,而 x∈[1,ai]x\in[1,a_i]x∈[1,ai​],所以方案数为 ∑x=1aix\sum_{x=1}^{a_i}x∑x=1ai​​x

  • dpi+1,0←dpi,1⋅(ai+1)dp_{i+1,0}\leftarrow dp_{i,1}·(a_i+1)dpi+1,0​←dpi,1​⋅(ai​+1)

    由于 dpi,1dp_{i,1}dpi,1​ 已经算了 iii 的贡献,转移只需要考虑 i→i+1i\rightarrow i+1i→i+1 的球数,且此情况下先不计算 i+1i+1i+1 在自己手上选球的贡献

    传递 0,1,...,ai0,1,...,a_i0,1,...,ai​ 个一共是 ai+1a_i+1ai​+1 种方案

  • dpi+1,1←dpi,0⋅(ai⋅ai(ai+1)2−ai(ai+1)(2ai+1)6)dp_{i+1,1}\leftarrow dp_{i,0}·\Big(a_i·\frac{a_i(a_i+1)}{2}-\frac{a_i(a_i+1)(2a_i+1)}{6}\Big)dpi+1,1​←dpi,0​⋅(ai​⋅2ai​(ai​+1)​−6ai​(ai​+1)(2ai​+1)​)

    由于 i,i+1i,i+1i,i+1 的贡献都没有计算,转移时要一起加上

    如果 iii 传递了 xxx 个,那么就还剩下 ai−xa_i-xai​−x 个,iii 是从自己手中选,则有 ai−xa_i-xai​−x 中选法,i+1i+1i+1 是从 iii 传的球中选一个,则有 xxx 种选法

    所以总方案数为 ∑x=1aix(ai−x)=ai⋅∑x=1ai−∑x=1aix2=ai⋅ai(ai+1)2−ai(ai+1)(2ai+1)6\sum_{x=1}^{a_i}x(a_i-x)=a_i·\sum_{x=1}^{a_i}-\sum_{x=1}^{a_i}x^2=a_i·\frac{a_i(a_i+1)}{2}-\frac{a_i(a_i+1)(2a_i+1)}{6}∑x=1ai​​x(ai​−x)=ai​⋅∑x=1ai​​−∑x=1ai​​x2=ai​⋅2ai​(ai​+1)​−6ai​(ai​+1)(2ai​+1)​

  • dpi+1,1←dpi,1⋅ai(ai+1)2dp_{i+1,1}\leftarrow dp_{i,1}·\frac{a_i(a_i+1)}{2}dpi+1,1​←dpi,1​⋅2ai​(ai​+1)​

    由于已经计算了 iii 的贡献,所以只需要考虑 i+1i+1i+1 的贡献

    i+1i+1i+1 选的是 iii 传递的球,如果 iii 传了 xxx 个,那么就有 xxx 种选择,方案数为 ∑x=1aix=ai(ai+1)2\sum_{x=1}^{a_i}x=\frac{a_i(a_i+1)}{2}∑x=1ai​​x=2ai​(ai​+1)​

最后因为是个环,所以初始应该钦定 111 的选择

显然这个 dpdpdp 的过程并没有考虑 min⁡{ci}=0\min\{c_i\}=0min{ci​}=0 的限制,而是随意转移

所以利用容斥,减去强制至少转移一个球的方案数,就对应着至少有一个人的 ci=0c_i=0ci​=0 的方案数

具体而言:

  • iii 从自己手上剩的球选择,剩的球就被限制为了 1,2,...,ai−11,2,...,a_{i-1}1,2,...,ai−1​

    转移变为 dpi+1,0←dpi,0⋅ai(ai−1)2dp_{i+1,0}\leftarrow dp_{i,0}·\frac{a_i(a_i-1)}{2}dpi+1,0​←dpi,0​⋅2ai​(ai​−1)​

  • iii 传递给 i+1i+1i+1 至少都是一个球 1,2,...,ai1,2,...,a_i1,2,...,ai​

    转移变为 dpi+1,0←dpi,1⋅aidp_{i+1,0}\leftarrow dp_{i,1}·a_idpi+1,0​←dpi,1​⋅ai​

  • case3 case4 的转移,因为为了使 (x1)\binom{x}{1}(1x​) 有意义,所以 xxx 自带条件就是 ≥1\ge 1≥1,转移不变

code

#include <cstdio>
#include <cstring>
#define int long long
#define mod 998244353
#define maxn 300005
const int inv2 = ( mod + 1 ) / 2;
const int inv6 = ( mod + 1 ) / 6;
int n;
int a[maxn];
int dp[maxn][2];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}int solve( int o, int k ) {memset( dp, 0, sizeof( dp ) );dp[1][o] = 1;for( int i = 1, x, g, f;i <= n;i ++ ) {x = a[i] - k;g = x * ( x + 1 ) % mod * inv2 % mod;dp[i + 1][0] = ( dp[i][0] * g + dp[i][1] * ( x + 1 ) ) % mod;x = a[i];g = x * ( x + 1 ) % mod * inv2 % mod;f = x * ( x + 1 ) % mod * ( x << 1 | 1 ) % mod * inv6 % mod;dp[i + 1][1] = ( ( a[i] * g - f ) % mod * dp[i][0] + dp[i][1] * g ) % mod;}return dp[n + 1][o];
}signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &a[i] );printf( "%lld\n", ( ( solve( 1, 0 ) + solve( 0, 0 ) - solve( 0, 1 ) - solve( 1, 1 ) ) % mod + mod ) % mod );return 0;
}

[AtCoder Regular Contest 124E] Pass to Next(dp+数学)相关推荐

  1. Atcoder Regular contest 085F NRE 线段树+DP

    题意:给你两个序列,a全部为0,b给出,给出一些区间,可以把a上的这些区间变为全1,要求操作以后两个序列对应位置不相同的个数最小,n<=2e5. 说实话这种区间操作很容易想到线段树,但是我没想到 ...

  2. AtCoder Regular Contest 100 E - Or Plus Max Sos dp

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为2n2^n2n的数组,让你对于所有的1≤k≤2n−11\le k\le 2^n-11≤k≤2n−1求最大的ai+aj,0≤i<j≤2n−1 ...

  3. NOMURA Programming Contest 2021(AtCoder Regular Contest 121)

    文章目录 A - 2nd Greatest Distance B - RGB Matching C - Odd Even Sort D - 1 or 2 E - Directed Tree F - L ...

  4. AtCoder Regular Contest 065

    AtCoder Regular Contest 065 C - Daydream Score : 300300300 points 倒着来就行了,正着来会产生歧义匹配,dreamer,dreamdre ...

  5. AtCoder Regular Contest 100 D - Equal Cut 思维 + 前缀和

    传送门 文章目录 题意: 思路: 题意: 给你一个数组aaa,你要将其分成四份,让这四份中和的最大值−-−最小值最小,输出这个最小值. n≤2e5,ai≤1e9n\le2e5,a_i\le1e9n≤2 ...

  6. AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)

    AtCoder Regular Contest 061 E - Snuke's Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流,所以一读这题后,我就想到了最小费用 ...

  7. AtCoder题解——AtCoder Regular Contest 107——B - Quadruple

    题目相关 题目链接 AtCoder Regular Contest 107 B 题,https://atcoder.jp/contests/arc107/tasks/arc107_b. Problem ...

  8. AtCoder Regular Contest 085 F NRE 线段树优化dp

    题意 有长度为n初始全为0的数组A和仅由0和1组成的数组B.现在给出m个区间,每次可以选择某个区间[l,r],使得A数组下标在[l,r]之间的元素变为1.问A和B最小不同位置数量是多少. n,m< ...

  9. AtCoder Regular Contest 116 D - I Wanna Win The Game(二进制 + dp)

    链接: D - I Wanna Win The Game 题意: 给定一个 n , m (1 ≤\leq≤n , m ≤\leq≤ 5000) , 求有多少个长度为 n的A序列满足,a[i] ≥\ge ...

最新文章

  1. python导出csv不带引号的句子_python csv writer在不需要时添加引号
  2. java 一元一次方程求解_七年级一元一次方程概念和解法,掌握这些就够了!
  3. Android插件化开发之DexClassLoader动态加载dex、jar小Demo
  4. leetcode(167)两数之和 II - 输入有序数组
  5. centos7修改ip地址自动获取_南京课工场IT培训:如何搭建DHCP服务器及自动获取IP地址及相关操作...
  6. Windows Redis3 安装
  7. [整理]解析Json需要设置Mime
  8. Oracle XDB 组件 重建 说明
  9. AUTOSAR 基础软件的内在安全
  10. SSM+服装管理系统 毕业设计-附源码080948
  11. [牛客网] 电话号码
  12. 计算机网络——单播、多播(组播)、广播
  13. 怎么从头开始构建一个基于web浏览器的云游戏平台--前言——带目录
  14. Android发送彩信(带图片附件)
  15. 知识付费APP的崛起
  16. 计算机组成原理 | 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?...
  17. stram是不是用php语言,简中成steam第一大语言,玩家却大喊:千万别进来
  18. 什么是G.654.E光纤?适合使用在什么场景?
  19. 针对移动手机漏洞与安全支付现状分析
  20. Spring Cloud在中小型项目中的应用

热门文章

  1. sklearn线性回归详解
  2. python中test_在python中生成py.test测试
  3. java注解 sql_mybatis中注解映射SQL示例代码
  4. 51单片机除c语言 中断嵌套,关于51系列单片机中断嵌套 - 关于单片机中断嵌套总结...
  5. 如何将mysql文件导入MySQL_如何将mysql5的sql文件导入到mysql4?
  6. c++11 string u8_深入理解C++11:C++11新
  7. python——学习笔记2
  8. idea中右侧的Maven框消失了
  9. xml可以html标签吗,自定义html标签(XML)
  10. C++实现各种排序以及复杂度,稳定性分析