首页 > 其他分享 >CF140E New Year Garland

CF140E New Year Garland

时间:2024-07-20 22:07:32浏览次数:12  
标签:le 颜色 Garland int 小球 times CF140E fac New

题意

有 \(m\) 种小球,用这些小球装饰一棵 \(n\) 层的圣诞树,每层需要放置 \(a_i\) 个小球。在每一层中,相邻球颜色不同,且相邻两层球颜色集合不同,求装饰圣诞树的方案数,答案对 \(p\) 取模。

\(1\le n,m\le10^6,2\le p\le10^9,1\le a_i\le5000,\sum_{i = 1}^n a_i \le 10^7 \qquad \text{5s,250MB}\)

题解

贺 Daniel_lele 的题解。

先解决每一行的问题,每一行的要求是相邻球颜色不同,于是设 \(f_{i,j}\) 表示 \(i\) 个位置,用 \(j\) 种颜色的小球去填的方案数。状态转移就考虑是使用用过的颜色,还是没用过的颜色。

\[f_{i,j} = f_{i - 1,j}\times(j - 1) + f_{i - 1,j - 1} \]

接下来考虑行与行之间的关系,若两行放的球颜色种数不同,那么集合更不可能相同;若颜色数相同,只需要在选颜色的时候方案减掉一种即可。设 \(g_{i,j}\) 表示第 \(i\) 层放 \(j\) 种颜色的球的方案数。由上述内容,首先枚举当前层颜色种数 \(j\),上一层颜色种数 \(k\),若 \(j \neq k\),则:\(g_{i,j} = f_{a_i,j}\times g_{i - 1,k} \times {m\choose j} \times j!\),反之 \(g_{i,j} = f_{a_i,j}\times g_{i - 1,k} \times \left({m\choose j - 1} - 1\right)\times j!\)。

\(k\) 的枚举是不必要的,记 \(h_i = \sum_{j = 1}^{a_i} g_{i,j}\),整理得到:

\[g_{i,j} = f_{a_i,j}\times (h_{i - 1}\times {m\choose j} - g_{i - 1,j})\times j! \]

时间复杂度为 \(\mathcal{O}(n + \sum a)\)。


代码实现中,需要注意,因为模数不一定为质数,所以不能使用逆元求组合数,注意边界设为 \(1\)。

#include <bits/stdc++.h>
using namespace std;

const int N = 5e3 + 5,M = 1e6 + 5;

#define int long long

int n,m,P;

int fac[N],C[N];

int a[M],L;

int f[N][N],g[N],_g[N];

void init(){
    fac[0] = 1;
    for (int i = 1;i < N;i++) fac[i] = 1ll * fac[i - 1] * i % P;
    C[0] = 1;
    for (int i = 1;i <= min(m,L);i++) C[i] = 1ll * C[i - 1] * (m - i + 1) % P;
}

signed main(){
    cin >> n >> m >> P;
    for (int i = 1;i <= n;i++)
        cin >> a[i], L = max(L,a[i]);
    init();
    f[0][0] = 1;
    for (int i = 1;i <= L;i++)
        for (int j = 0;j <= min(m,i);j++){
            if (j > 1) (f[i][j] += f[i - 1][j] * (j - 1)) %= P;
            (f[i][j + 1] += f[i - 1][j]) %= P;
        }
    _g[0] = 1;
    for (int i = 1;i <= n;i++){
        int s = 0;
        for (int j = 0;j <= a[i - 1];j++)
            (s += _g[j]) %= P;
        for (int j = 0;j <= a[i];j++){
            g[j] = s * C[j] % P * f[a[i]][j] % P;
            if (j <= a[i - 1]) (g[j] += P - _g[j] * fac[j] % P * f[a[i]][j] % P) %= P;
        }
        for (int j = 0;j <= a[i];j++) _g[j] = g[j];
    }
    int ans = 0;
    for (int i = 0;i <= a[n];i++)
        (ans += _g[i]) %= P;
    cout << ans;
    return 0;
}

标签:le,颜色,Garland,int,小球,times,CF140E,fac,New
From: https://www.cnblogs.com/y1wei/p/-/solution_CF_140E

相关文章

  • 为什么选择Spring容器管理对象而不是直接使用new?
    为什么选择Spring容器管理对象而不是直接使用new?在Java开发中,创建对象是再普通不过的操作了。我们通常会使用new关键字来实例化一个类。然而,随着项目的复杂度增加,直接使用new来创建对象会带来很多问题。这时候,Spring容器就显得尤为重要。那么,为什么我们要选择Spring容器来管理对......
  • String s = “hello“和String s = new String(“hello“)的区别
    这涉及字符串加载到字符串常量池的原理:由于字符串字面量先在编译阶段加载到class常量池中,然后在类加载阶段从类常量池中加载到运行时常量池中,当字符串字面量被调用的时候,会检查字符串常量池中是否包含该字符串对象,如果已经包含,则直接返回该字符串对象的引用,如果没有,则创建该字符串......
  • .NET|--杂类|--json文件未释放, 就开始反序列化, 报错Newtonsoft.Json Unexpected cha
    前言一个看起来很莫名其妙的错误,json文件我打开看了下,格式也都正确,但是在vs中调试的时候,监视--查看--JSON可视化工具查看json字符串的话,会提示"字符串未设置为JSON格式","监视--查看--文本可视化工具",发现json格式确实看不出来任何问题.报错#报......
  • php中遇到new $a($b)的解法 imagick类的利用绕过open_basedir
    今天做题遇到一个新的知识点,接下来回顾下。源码<?phperror_reporting(0);ini_set('open_basedir',__DIR__.":/tmp");define("FUNC_LIST",get_defined_functions());classfumo_backdoor{public$path=null;public$argv=null;publ......
  • 《QQ三国》bugreportnew.dll 加载失败:游戏启动难题的深度解析与修复
    遇到《QQ三国》游戏加载bugreportnew.dll失败的问题,通常意味着游戏在启动或运行时未能成功加载或初始化bugreportnew.dll这个动态链接库(DynamicLinkLibrary)文件。bugreportnew.dll文件可能是游戏内置错误报告系统的一部分,用于在游戏崩溃或遇到问题时收集错误信息并生成报告。......
  • Qt - QtWebEngineWidgets模块
    1、QtWebEngineWidgets模块 #include<QtWebEngineWidgets>QT+=webenginewidgets 1.1QWebEnginePage示例代码:#include<QtWebEngineWidgets>#include<QWebEnginePage>//1、创建一个新的QWebEnginePage实例:page=newQWebEnginePage(this);......
  • NEW_我不喜欢_strlcpy
    https://nrk.neocities.org/articles/not-a-fan-of-strlcpy作者讨论了strcpy的变体strlcpy,并认为这个变体没有使用的意义。他们都是把字符串拷贝到另一个位置的函数,strcpy因为不限制目标位置的长度,容易产生缓冲区溢出,因此被很多人认为是不安全的。strlcpy则改进了这种行为......
  • Pandas运行报错分析:ValueError: Length mismatch: Expected axis has 0 elements, new
    ✨✨欢迎大家来到景天科技苑✨✨......
  • 记一次Burp与NEW_xp_CAPTCHA工具联动爆破验证码
    首先下载NEW_xp_CAPTCHA工具地址:https://github.com/smxiazi我下载的是大佬直接发布的打包好的环境,包括对应python3.6.6与NEW_xp_CAPTCHA工具脚本下载完后直接点击运行即可本地访问http://127.0.0.1:8899/,看到这个页面,证明没问题然后就是burp导入插件jar。这里要下载xp_CA......
  • Python安装出现严重错误的解决方法_0x80070643-( A newer version of the Python laun
    每次在装软件配置环境的时候,总会遇到别人碰不到的各种问题,人都麻了。最后我还是自己尝试这解决了,只是建议,虽然说不知道是否以后还会问题,但是可以成功安装,配置环境并运行。(本人是win11)首先解释一下pythonlauncher是什么资料解释:PythonLauncher是Python官方提供的一个工具,......