首页 > 其他分享 >[ARC106F] Figures 题解

[ARC106F] Figures 题解

时间:2023-11-16 22:24:03浏览次数:32  
标签:right const 题解 ARC106F T1 Figures left mod MOD

题意

给定 \(N\) 个带有若干洞的节点,其中第 \(i\) 个点上有 \(d_i\) 个洞。

先可以在两个不同的节点的洞之间连边,一个洞最多连一条边,求使得最终形成的图是一棵树的方案数,对 \(998244353\) 取模。

洞之间相互区分,两个方案不同当且仅当存在一条边在两个方案中的连的洞不同。

  • \(2 \le N \le 2 \times 10^5\)
  • \(1 \le d_i < 998244353\)

题解

首先设 \(S = \sum d_i\),那么首先考虑 \(S \ge 2 \left(N - 1\right)\) 的情况,即一定有解的情况。

考虑组成一棵树的过程,可以从每个节点的父边入手,考虑对于每个节点,钦定一个特殊洞,使得其连向父亲节点。

那么我们每次操作可以转化为选择一个特殊洞,再选择一个非特殊洞,使得其相连。

可以发现每次操作后联通块数量一定会减少,在仅剩 \(2\) 个联通块时我们可以使其两个特殊洞相连,进而确定方案。因此我们只需要操作 \(N - 2\) 次。

考虑如何计算方案数。首先钦定特殊洞的方案数显然为 \(\prod d_i\)。对于第 \(i\) 次选择,我们可以从 \(N - i + 1\) 个特殊洞中选择一个,从 \(S - N - i + 1\) 个非特殊洞中选择一个,因此方案数为 \(\left(N - i + 1\right) \times \left(S - N - i + 1\right)\)。

因此可以得出总方案数:

\[\prod d_i \times \prod\limits_{i = 1}^{N - 2} \left(N - i + 1\right) \times \left(S - N - i + 1\right) \]

\[\prod d_i \times \prod\limits_{i = 0}^{N - 3} \left(S - N - i\right) \times N^{\underline{N - 2}} \]

发现每个节点被选择的顺序是不影响最终的方案的,但是被计算了多次,考虑除去这个影响。

因此最终答案为:

\[\prod d_i \times \prod\limits_{i = 0}^{N - 3} \left(S - N - i\right) \]

可以发现,若 \(S < 2 \left(N - 1\right)\),那么上式的值一定为 \(0\),于实际相符,因此直接计算上式的值即可。

Code

#include <bits/stdc++.h>

typedef long long valueType;
typedef std::vector<valueType> ValueVector;

namespace MODINT {
    constexpr valueType MOD = 998244353;

    template<typename T1, typename T2, typename T3 = valueType>
    void Inc(T1 &a, T2 b, const T3 &mod = MOD) {
        a = a + b;

        if (a >= mod)
            a -= mod;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    void Dec(T1 &a, T2 b, const T3 &mod = MOD) {
        a = a - b;

        if (a < 0)
            a += mod;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    T1 sum(T1 a, T2 b, const T3 &mod = MOD) {
        return a + b >= mod ? a + b - mod : a + b;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    T1 sub(T1 a, T2 b, const T3 &mod = MOD) {
        return a - b < 0 ? a - b + mod : a - b;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    T1 mul(T1 a, T2 b, const T3 &mod = MOD) {
        return (long long) a * b % mod;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    void Mul(T1 &a, T2 b, const T3 &mod = MOD) {
        a = (long long) a * b % mod;
    }

    template<typename T1, typename T2, typename T3 = valueType>
    T1 pow(T1 a, T2 b, const T3 &mod = MOD) {
        T1 result = 1;

        while (b > 0) {
            if (b & 1)
                Mul(result, a, mod);

            Mul(a, a, mod);
            b = b >> 1;
        }

        return result;
    }

    constexpr valueType Inv2 = (MOD + 1) / 2;
}// namespace MODINT

using namespace MODINT;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    valueType N;

    std::cin >> N;

    valueType ans = 1, S = 0;

    ValueVector D(N);

    for (auto &iter : D) {
        std::cin >> iter;

        Mul(ans, iter);

        Inc(S, iter);
    }

    for (valueType i = 0; i <= N - 3; ++i)
        Mul(ans, sub(S, N + i));

    std::cout << ans << std::endl;

    return 0;
}

标签:right,const,题解,ARC106F,T1,Figures,left,mod,MOD
From: https://www.cnblogs.com/User-Unauthorized/p/solution-ARC106F.html

相关文章

  • P9400 题解
    blog。很naive的题,写这篇题解,主要是现有题解都用的线段树/平衡树,让我感到很难绷。一眼DP。\(dp_{i,j}\)表示前\(i\)个宿舍,现在有连续\(j\)个灯亮大于\(B\),方案数。\(dp_{i,0}=\max(\min(B,r_i)-l_i+1,0)\cdot\sum\limits_{j=0}^{A-1}dp_{i-1,j}\)。\(dp_{i......
  • CF8E 题解
    blog。抽象意义上单杀了。首先第一位必定为\(0\),然后取反串就不用去考虑了。\(n\le50\),考虑爆搜。搜整个串的前一半(设半长为\(M=\left\lfloor\dfracn2\right\rfloor\),前一半的串在十进制下值为\(v\)),后半段的数量可以计算:整个串最后一位是\(0\),只需满足逆序串。\(n\)为......
  • P7701 [CCC2014] 提前交卷 题解
    目录DescriptionSolutionCodeDescription在一个教室里有\(n\)排座位,每排有\(6\)个,从左至右标号分别为ABCDEF,其中C和D中有过道,通往教室前端和后端的两个房间,每个房间最开始没有人,每个座位上开始都有人。有\(m\)个不同的学生会依次提前交卷,先从这一排走到过道上,在从......
  • 鼠标拖拽拖动盒子时,与盒子内某些点击事件冲突问题解决
    问题:拖动时会触发圆球的点击事件解决鼠标拖动盒子时,将moving设为true意为正在拖动盒子,此时将class="move"遮挡容器展示在悬浮球上层,以覆盖悬浮球,此时也就不存在触发悬浮球点击事件的冲突了;鼠标拖动完盒子弹起时再将 moving设为false意为不在拖动盒子(遮挡容器class=......
  • C++调用Python3实战,和PyImport_ImportModule返回NULL问题解决
    LinuxC++调用Python3入门准备以下面的目录结构演示如何在LinuxC/C++调用python3。|--hello.py|--main.cpp|--CMakeLists.txt hello.py:python的脚本,里面有2个函数main.cpp:c++函数CMakeLists.txt:Cmake文件,生成makefilepython脚本示例python脚本hello.py内容如下,......
  • 赛前集训11天题解大总
    Day1kitty核心思路:将转移过程中的方案加入转移矩阵,边转移边累加stringdp设计:\(f[i][x][y]\)表示长度为\(i\),第一段以\(x\)结尾,且\(x\leqslantp\),第二段以\(p\)开头,以\(y\)结尾的两段完全相同的序列的对数。对于每个\(p\)答案就是\(\sum_{i=1}^{n}i\cdotf[i][x......
  • 题解:Feel Good
    题目链接依然枚举每个位置作为最小值的情况,记录“值/下标”二元组,按第一维从大到小排序后,每次将第二位的位置在序列中标成\(1\),那么选择的一定是序列里一个\(1\)的极长段。加入一个位置检查其左右是否加入过,如果加入过就用并查集合并掉,同时维护极长段的和/左右端点是简单的,复......
  • 【洛谷 P2141】[NOIP2014 普及组] 珠心算测验 题解(集合+多重循环)
    [NOIP2014普及组]珠心算测验题目描述珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合......
  • B3871 题解
    题目链接题意简述给定一个正整数\(N\),将它的因数分解式按规定输出。题目分析模拟题意即可。具体地,我们可以枚举\(2\)到\(\lfloor\sqrtN\rfloor\)中所有数\(i\),如果\(i\)能整除\(N\),则不断地从\(N\)中除掉\(i\),直到\(i\)不再能整除\(N\),在这个过程中,我们同......
  • CF1436E Complicated Computations 题解
    CF1436EComplicatedComputationsmex的定义是:一个区间中没有出现过的数中最小的整数。对于一个区间,当正整数x在区间中没有出现过、[1,x-1](整数)在区间中全部出现过,那么正整数x就是该区间的mex正整数x在区间中没有出现过我们一共有n个数字,所有的数字都不出现一次,就一共有n次......