首页 > 其他分享 >CF1089I Interval-Free Permutations

CF1089I Interval-Free Permutations

时间:2024-05-26 12:22:18浏览次数:14  
标签:CF1089I int Interval long Free 400 fac 析合树 mod

标签:析合树

析合树就是用来处理这一种值域连续段的问题的。

OI-wiki 上对于析合树的讲解。

我们回顾一下题目,要求不存在长度为 \([2, n - 1]\) 之间的连续段,换句话说,就是根节点下恰有 \(n - 1\) 个节点,且没有任何一个字段是题目中要求的连续段。

我们记这样的答案为 \(A_n\) 也就是我们要求的答案。直接解决是 Hard 的,我们考虑容斥一下,算存在连续段的方案数。

首先需要分类讨论:

根是合点

不妨以递增顺序的合点为例,显然递减的情况是一样的。

设 \(I_x\) 表示前 \(x\) 位有多少种填法,使得任意一个前缀都不是连续段。

\[I_x = \sum_{i = 1}^{x - 1} I_i(x - i)! \]

前面方案乘上后面随便的方案之和即可。

这一种情况的答案就是 \(2\sum_{i = 1}^{n} I_i(n - i)!\)。

根是析点

这一步我们要知道子树中任意一个子段都不是连续段,这个就是我们之前设的 \(A\) 数组,同样考虑递推求出来。

首先要枚举有几个儿子,然后乘上这些段的答案即可。

那么我们还需要 DP 计算出 \(n\) 个点放在 \(j\) 段中的方案。

然后递推出 \(A\) 数组即可。

代码

点击查看代码
#include <bits/stdc++.h>
#define int long long

#define F(i, a, b) for (int i = (a); i <= (b); i++)
#define dF(i, a, b) for (int i = (a); i >= (b); i--)
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 405, M = (N << 1), inf = 1e16;
int mod, n, m, A[N], I[N], fac[N], B[N][N];
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> mod;
    fac[0] = 1;
    F(i, 1, 400) I[i] = fac[i] = fac[i - 1] * i % mod;
    F(i, 2, 400)
        F(j, 1, i - 1) 
            I[i] = (I[i] - I[j] * fac[i - j] % mod + mod) % mod;
    B[0][0] = 1;
    F(i, 1, 400) F(j, 1, i) F(k, 1, i)
        B[i][j] = (B[i][j] + B[i - k][j - 1] * fac[k] % mod) % mod;
    A[1] = 1, A[2] = 2, A[3] = 0;
    F(i, 4, 400) {
        A[i] = fac[i];
        F(j, 1, i - 1)
            A[i] = (A[i] - 2 * I[j] * fac[i - j] % mod + mod) % mod;
        F(j, 4, i - 1)
            A[i] = (A[i] - B[i][j] * A[j] % mod + mod) % mod;
    }
    F(i, 1, n) {
        int x;
        cin >> x;
        cout << A[x] << '\n';
    }
    return 0;
}

标签:CF1089I,int,Interval,long,Free,400,fac,析合树,mod
From: https://www.cnblogs.com/z-t-rui/p/18213509/CF1089I

相关文章

  • D - Intersecting Intervals
    D-IntersectingIntervals 思路对于区间重合问题,经典做法对left进行排序,然后进行统计计数。写了一版TLE,反思有冗余计数问题。计算每一个区间的覆盖数目,不需要TLE版本逐个往后数,只需要使用lower_bound找出第一个大于等于ri+1 的位置,即可得到与i区间重合区间......
  • Xfce4桌面背景和桌面图标消失问题解决@FreeBSD
    问题:Xfce4桌面背景和桌面图标消失以前碰到过好几次桌面背景和桌面图标消失,整个桌面除了上面一条和下面中间的工具条,其它地方全是黑色的问题,但是这次重启之后也没有修复,整个桌面乌黑一片,啥都没有,用起来特别不得劲,于是开始修复。修复过程咨询文心,建议这样设置:检查壁纸设置:......
  • 配置freepbx asterisk sip nat 实现外部分机注册
    映射5160tcpudp映射10000-20000 可修改范围创建传统分机或在高级内转换为chan_sip配置sip  分机NAT如下 配置asterisksip全局nat设置外部内部ip   静态设置选择后(已经有外部ip) 动态在全局留空外部ip后设置动态主机域名(未测试)    ......
  • Linux学习笔记16---常用操作命令(free命令)
    free命令显示系统内存的使用情况,包括物理内存、虚拟内存(swap)和内核缓冲区内存。如果加上-h选项,输出的结果会友好很多:有时我们需要持续的观察内存的状况,此时可以使用-s选项并指定间隔的秒数:$free-h-s3上面的命令每隔3秒输出一次内存的使用情况,直到你按下ctr......
  • freebsd、openbsd、netbsd的区别
    开源BSD有三大系列:freebsd、openbsd、netbsd。其实MacOSX也是BSD系列,只不过是商业。1.FreeBSDFreeBSD是从386BSD的基础上发展起来的,而386BSD是由伯克利的计算机科学家BillJolitz开发的针对Intel80386芯片的一种BSD版本。因为这个原因,FreeBSD在32位体系的x86机器上总是运行......
  • Ubuntu安装软IPPBX(Free 100用户)
    1、Ubuntu安装Docker镜像,执行以下命令进行安装最新Docker镜像,等待几分钟sudocurl-fsSLhttps://get.docker.com|bash-sdocker--mirrorAliyun 2、查看Docker版本 3、下载Xswitchwgethttps://xswitch.cn/download/xswitch-community-6.1.2.tar.gz--userxswi......
  • myfreemp3音乐token逆向
    目前还能用。window=global;constCryptoJS=require('crypto-js')functionFs(e,t){returne['charCodeAt'](Math['floor']({ELxvT:function(e,t){returne%t}}["ELxvT"](t,64)))}......
  • 记录freeswitch的一个2833问题
    概述freeswitch是一款简单好用的VOIP开源软交换平台。运营商内部新老系统混用,互联互通的问题较多,其中以DTMF码的问题最多,花样也多。环境CentOS7.9freeswitch1.10.7问题描述问题现象正常的fs业务服务器,呼叫正常,部分呼叫报错DTMF收码失败。内部测试,呼叫正常,信令正常,媒体......
  • 部署freeipa中报错:Command '/bin/systemctl start certmonger.service' returned non-
    cat/etc/dbus-1/system.d/certmonger.conf<allowsend_destination="org.fedorahosted.certmonger"send_interface="org.fedorahosted.certmonger"/><allowsend_destination="org.fedorahosted.certmonger"......
  • free AI online tools All In One
    freeAIonlinetoolsAllInOne免费AI在线工具/免费人工智能在线工具DuckDuckGoAIChat测试版Claude3Haikuhttps://duckduckgo.com/?q=DuckDuckGo&ia=chatChatGPTfunctioncurry(func){returnfunctioncurried(...args){if(args.length>=......