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)$。

  • 相关阅读:
    4.Linux的目录结构
    使用idea创建spring mvc项目图文教程
    传统的Servlet在spring boot中怎么实现的?
    springboot系列教程导学篇
    记录一次序列化引起的问题解决办法 查看已编译类序列化值
    springboot支付项目之springboot集成jpa
    springboot支付项目之日志配置
    设计模式之状态模式总结篇
    看了这个Java实习生入职测试题后,幸亏我不是实习生
    幂等性学习及接口的幂等性
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/agc036c.html
Copyright © 2011-2022 走看看