zoukankan      html  css  js  c++  java
  • 【AGC 036C】GP2

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

     题意

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

      $nle 10^6, mle 5 imes 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_0gt 0$

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

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

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

  • 相关阅读:
    Freewriting23_Hunting job again.
    PYDay4基本数据类型、字符串、元组、列表、字典
    PYDay3初识python
    PYDay2linux基础\常用命令
    PYDay1洗剑
    ASP.NET 2.0中GridView无限层复杂表头的实现(datagrid大同小易,repeater就不必这样,直接有头模版布局就可以)
    JavaScript获取HTML DOM节点元素的方法的总结
    Asp.net中实现同一用户名不能同时登陆(转)
    在JS文件中写脚本几种常见的形式
    获取repeater中头模版中的控件时要加从controls[0]
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/agc036c.html
Copyright © 2011-2022 走看看