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

  • 相关阅读:
    POJ1486 Sorting Slides 二分图or贪心
    POJ2060 Taxi Cab Scheme 最小路径覆盖
    POJ3083 Children of the Candy Corn 解题报告
    以前的文章
    POJ2449 Remmarguts' Date K短路经典题
    这一年的acm路
    POJ3014 Asteroids 最小点覆盖
    POJ2594 Treasure Exploration 最小路径覆盖
    POJ3009 Curling 2.0 解题报告
    POJ2226 Muddy Fields 最小点集覆盖
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/agc036c.html
Copyright © 2011-2022 走看看