【AtCoder】AGC036C - GP2

 https://atcoder.jp/contests/agc036/tasks/agc036_c

 题意

  有一个长度为 $n$ 的非负整数序列 $x$,初始时全为 $0$。一次操作定义为选择一对正整数 $i,j\space (i≠j)$,将 $x_i$ 加 $2$,将 $x_j$ 加 $1$。求 $m$ 次操作后能出现多少种不同的序列。

  $n\le 10^6, m\le 5\times 10^5$

 题解

  降智题,其实很简单

  $m$ 轮操作后的序列 $p$ 必定满足如下条件:

    1. $\sum_{i=0}^{n-1} p_i = 3m$

    2. $\max{(p_0,p_1,...,p_{n-1})} \le 2m$

    3. 序列中最多有 $m$ 个数是奇数

  但是感觉这样好像就没考虑操作时 $i≠j$ 的约束啊?

  事实上你会发现那个东西根本不用考虑。

  显然,条件2 可以排除一些只有存在 $i=j$ 的操作时才会出现的序列,但不能排除所有的。然而我们发现没被排除的序列都可以通过不存在 $i=j$ 的操作的途径得到。具体证明我不太清楚,直觉上这个结论很对……

 

  于是问题转化成了求满足条件的序列 $p$ 的数量。

  忽略条件2,对于剩下两个条件,可以枚举有多少个数是奇数(假设有 $a$ 个),显然有 $a$ 个奇数的方案数是 $C_{n}^{a}$。然后考虑把这些奇数都当成 $1$,我们接下来要计算地就是使 $n$ 个非负偶数的总和为 $3m-a$ 的方案数,这等价于求 $n$ 个非负整数的总和为 $\frac{3m-a}{2}$ 的方案数,用小学的插板法即可,答案是 $C_{(3m-a)/2+n-1}^{n-1}$。用乘法原理把 $C_{n}^{a}$ 和 $C_{(3m-a)/2+n-1}^{n-1}$ 相乘就得到了有 $a$ 个奇数的答案,对于不同的 $a$ 的情况把答案相加即可。

 

  然后我们减掉满足条件1、3,不满足条件2 的情况数。不难发现序列 $p$ 中只有一个数会超过 $2m$,因为序列 $p$ 中所有数的和是 $3m$。于是这部分不用容斥了,我们直接钦定第一个数超过了 $2m$,然后把得到的答案乘以 $n$ 即可。

  现在我们要求满足如下条件的序列 $q$ 的数量:

    1. $\sum_{i=0}^{n-1} q_i = m$

    2. 序列中最多有 $m$ 个数是奇数

    3. $q_0\gt 0$

  无视条件3,前两个条件跟之前问题的两个条件一样,用之前的求法即可求出。

  然后再减去满足条件1、2,不满足条件3 的情况数。不满足条件3 意味着 $q_0=0$,且它不是奇数,所以无视 $q_0$ 后,这部分情况数就是求满足前两个条件的长度为 $n-1$ 的序列 $q$ 的数量。也用之前的求法即可。

 

  预处理逆元,时间复杂度最低为 $O(n+m)$。

转载于:https://www.cnblogs.com/scx2015noip-as-php/p/agc036c.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值