首页 > 其他分享 >[ABC309G] - Ban Permutation 题解

[ABC309G] - Ban Permutation 题解

时间:2023-08-11 23:35:01浏览次数:45  
标签:ABC309G int 题解 sum leq Permutation Ban dp

[ABC309G] - Ban Permutation 题解

题目描述

求长为 \(N(N\leq 100)\) 且满足以下条件的排列 \(P=(P_1,P_2,...,P_N)\) 的个数,模 \(998244353\):

  • \(\forall 1\leq i\leq N\),\(|P_i-i|\geq X(X\leq 5)\)。

思路

首先拆绝对值,得到:

\[P_i\ge X+i\vee P_i\le X- i \]

数数题除了排列组合就是 DP,直接统计我不会,正难则反,看一下怎么从反面推出正面的答案。

假设有若干布尔变量 \(A_1\sim A_n\),表示第 \(i\) 个位置是否是非法的,如果把 \(A_i\) 考虑为一个集合,由并集容斥得:

\[\bigcup_{i = 1}^n A_i = \sum A_i - \sum_{i\ne j}{A_i\cap A_j}+...(-1)^k\bigcap_{i = 1}^n A_i \]

每一项的值分别表示至少一个不合法、至少两个不合法 ...... 至少 \(k\) 个不合法,最后用所有的情况 \(n!\) 减去所有非法情况的并即可求出答案。

推导上文不等式,得到不合法的位置满足:

\[P_i\in[X-i+1, X+i-1] \]

这个区间长度为 \(2X-1\),最多是 \(9\),考虑状压 DP。

\(dp[i][j][s]\) 表示当前在第 \(i\) 个位置,至少有 \(j\) 个不合法位置,区间 \([X-i+1, X+i-1]\) 中的选取情况为 \(s\)。

可以分两种情况转移:第 \(j + 1\) 个位置是否合法。

从二进制低到高位分别对应下标从小到大比较好转移。

\[f_i = n!, i =0 \\ f_i = \sum_s dp[n][i][s] = \bigcap_{p_1<p_2<...<p_{t}<...<p_k}A_{p_{t}}, i > 0\\ \]

答案为:

\[\sum_{i = 0}^n(-1)^k f_i (n - i)! \]

// Problem: G - Ban Permutation
// Contest: AtCoder - Denso Create Programming Contest 2023 (AtCoder Beginner Contest 309)
// Author: Moyou
// Copyright (c) 2023 Moyou All rights reserved.
// Date: 2023-08-10 00:08:16

#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 110, M = 11, mod = 998244353;

int n, x;
ll dp[N][N][(1 << M)], f[N];
ll fac[N], ans;

signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> x;
    dp[0][0][0] = 1;
    int base = (1 << (2 * x - 1)) - 1, k = 0;
    for(int i = 0; i < n; i ++)
        for(int j = 0; j <= i; j ++) 
            for(int s = 0; s <= base; s ++) {
                (dp[i + 1][j][s >> 1] += dp[i][j][s]) %= mod;
                for(int t = max(1, i - x + 2); t <= min(n, i + x); t ++) {
                    k = t - (i - x + 2);
                    if(k < 0) continue;
                    if(!((s >> 1) & (1 << k))) 
                        (dp[i + 1][j + 1][(s >> 1) ^ (1 << k)] += dp[i][j][s]) %= mod;
                }
            }
    for(int i = 0; i <= n; i ++)
        for(int s = 0; s <= base; s ++) f[i] = (f[i] + dp[n][i][s]) % mod;
    fac[0] = 1;
    for(int i = 1; i <= n; i ++) fac[i] = fac[i - 1] * i % mod;
    for(int i = 0; i <= n; i ++) ans = (ans + (((i & 1) ? -1 : 1) * fac[n - i] + mod) % mod * f[i] % mod) % mod;
    cout << ans << '\n';

    return 0;
}

标签:ABC309G,int,题解,sum,leq,Permutation,Ban,dp
From: https://www.cnblogs.com/MoyouSayuki/p/17624132.html

相关文章

  • 洛谷-P9496 题解
    正文在讲解之前,先来几种简单情况:让\(n=1\)转变成\(m=0\),只需要让\(n\land0\)即可;让\(n=0\)转变成\(m=1\),只需要让\(n\lor1\)即可。将\(n\)扩展成更大的。对于\(n\)二进制的每一位数,只需要按上述情况处理即可,而由于可以对任意数进行位运算,所以相同类型的位运......
  • 【题解】Educational Codeforces Round 147(CF1821)
    自己做出来了A-E,F算是搞懂GF后第一道符合我这个菜鸡水平的实战,可惜的是根本没意识到可以GF。A.Matching题目描述:整数模板是每位均为数字或问号的字符串。如果可以用数字替换模板中的每个问号,从而获得该正整数(严格大于\(0\))的十进制表示形式,且不带任何前导零,则该正整数......
  • Codeforces Round 874 (Div. 3) 题解
    A.MusicalPuzzle字符串\(s\)的不同的长度为\(2\)的子串个数就是答案可以用set处理B.RestoretheWeather将\(a\)数组排序后,在\(b\)数组中找到第一个大于等于\(a_i-k\)的元素与\(a_i\)对应即可可以用multiset实现(用multiset自带的lower_bound()比较好,......
  • Codeforces Round 878 (Div. 3) 题解
    A.CipherShifer从头开始扫一遍即可,扫到两个相同的表示某一个字符的解密结束B.BinaryCafe首先,我们不妨把题意转换为有多少种不同的花钱方案因为每一种咖啡就是一个二进制有\(k\)位的数字的其中一位,而对于不同的方案,其二进制位不完全相同,则每一个方案对应的花费一定不同,......
  • ARC137D Prefix XORs 题解
    这里的所有下标从\(\bm0\)开始。我们考察一下每次操作后的数列\(a\)会是什么样的。这里用\(a_i\)前面的系数\(x\)表示\(a_i\)贡献了\(x\)次,\(+\)表示异或。\[\begin{matrix}k=0&a_0&a_1&a_2&\cdots&a_{n-1}\\k=1&a_0&a_0+a_1&a_0+a_1+a_2&\cdots&......
  • Subtree 题解
    Subtree题目大意给定一颗树,你可以选出一些节点,你需要对于每个点求出在强制选这个点的情况下所有选择的点联通的方案数,对给定模数取模。思路分析对于这种求树上每一个点方案数的题目,首先考虑换根DP。强制嵌定树根为\(1\),设\(f_i\)表示在\(i\)的子树中选点,\(i\)强制选,所......
  • CF960G Bandit Blues
    半个月前做的题,这段时间一直在颓所以没写题解,今天突然想起来才准备补上。考虑枚举最大值\(n\)的位置\(i\),那么排列就被分成\(2\)个段\([1,i-1]\)和\([i+1,n]\),而且\(\forallk\in[i+1,n]\),\(k\)不可能是前缀最大值;\(\forallk\in[1,i-1]\),\(k\)不可能是后缀最大值。......
  • 国标GB28181视频云服务平台LntonGBS(源码)国标平台对接宇视SDK,多次点击录像回放出现崩溃
    LntonGBS是一款基于国标GB28181协议的视频云服务平台。通过该平台,可以实现设备接入并支持视频的实时监控直播、录像、语音对讲、云存储、告警、级联等功能。此外,LntonGBS还支持将接入的视频流进行全终端、全平台的分发,包括支持RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流分发。另......
  • 题解 LuoguP3306 [SDOI2013] 随机数生成器
    题目链接:【LuoguP3306】。前置知识OI-Wiki:快速幂,扩展欧几里得算法(exgcd),BabyStep,GiantStep算法。题意很清楚,不说。分析当\(t=x\)时答案很明显为\(1\),即在第一天就可以读到。当\(t\neqx\)时当\(a=0\)时观察一下规律:\[x_1\equivx_1\pmod{p}\]\[x_2\equivb......
  • HDU 多校 Round #6 题解
    HDU多校Round#6题解\(\text{ByDaiRuiChen007}\)A.CountProblemLink题目大意求有多少个长度为\(n\),字符集大小为\(m\)的字符串有长度为\(n-k\)的周期。数据范围:\(n,m,k\le10^{18}\)。思路分析\(k=n\)时答案为\(m^n\),否则转为有长度为\(k\)的Border,答案......