G - Ban Permutation

首先看到绝对值,很烦,考虑取掉绝对值得到\(p_i\leq i-X\)或\(p_i\geq i+X\)

然后我们就自然而然有了一个暴力的想法,设\(dp[i][s]\)表示前\(i\)个数选了的数的状态为\(S\),然后空间复杂度是\(O(N2^N)\)的,时间复杂度也是\(O(N2^N)\)的

这也太暴力了8,考虑优化

发现\(s\)这一维无论如何也优化不了,考虑减小它的状态数,我们先将\(dp[i][s]\)重新定义前\(i\)个的\(1\sim i-X\)和\(i+x\sim N\)的选取状态,然后这样\(2^N\)就减小为了\(2^{N-2X+1}\)

然后我们又发现\(X\leq5\),非常的小!所以我们考虑将\(dp[i][s]\)再次重新定义为前\(i\)个的\(i-X+1\sim i+X-1\)的选取状态,发现这样,我们似乎就只能转移得到不合法的状态,但是这样我们的时空复杂度都是\(O(N2^{2X-1})\)的,可以过

所以我们考虑容斥,\(ans=\sum_{i=0}^n (n-i)!\times val(i)\),\(i\)表示我们钦定了\(i\)个不合法的数

然后考虑\(val(i)\)怎么整,显然我们只需要给\(dp[i][s]\)再加上一维变成\(dp[i][j][s]\)表示前\(i\)个,有\(j\)个不合法的,目前\(i-X+1\sim i+X-1\)的选取状态

那么\(val(i)\)就等于\(\sum_{s=0}^{2^{2X-1}}dp[n][i][s]\)

然后就可以完结撒花了 *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。

#include<bits/stdc++.h>
using namespace std;
const int N=105,MOD=998244353;
int n,x,dp[N][N][1<<9],lim,ans,jc[N],val[N];
void add(int &x,int y){ x+=y; if(x>=MOD) x-=MOD; if(x<0) x+=MOD; }
int ad(int x,int y){ x+=y; if(x>=MOD) x-=MOD; return x; }
void Init(){
lim=(1<<((x<<1)-1))-1;
jc[0]=1;
for(int i=1;i<=n;++i) jc[i]=1ll*jc[i-1]*i%MOD;
}
int main(){
scanf("%d%d",&n,&x),Init();
dp[0][0][0]=1;
for(int i=0;i<n;++i)
for(int j=0;j<=i;++j)
for(int s=0;s<=lim;++s){
int now=s>>1;
add(dp[i+1][j][now],dp[i][j][s]);
int up=min((i+1)+x-1,n)-((i+1)-x+1),down=max(1,(i+1)-x+1)-((i+1)-x+1);
for(int k=down;k<=up;++k) if(!(now>>k&1)) add(dp[i+1][j+1][now|(1<<k)],dp[i][j][s]);
}
for(int i=0;i<=n;++i) for(int s=0;s<=lim;++s) add(val[i],dp[n][i][s]);
for(int i=0;i<=n;++i) add(ans,((i&1)?-1ll:1ll)*jc[n-i]%MOD*val[i]%MOD);
printf("%d",ans); return 0;
}

[abc309 G] Ban Permutation的更多相关文章

  1. AtCoder Beginner Contest 282 G - Similar Permutation

    套路题 题意 求有多少个 \(1\) 到 \(n\) 的排列满足恰有 \(k\) 对在排列中相邻的数满足前小于后 \(2 \leq n \leq 500, 0 \leq k \leq (n - 1)\ ...

  2. Codeforces 700 C. Break Up(Tarjan求桥)

    题意 给你一个有 \(n\) 个点, \(m\) 条边的无向图,每条有边权 \(w_i\) ,现在要选择至多两条边断开,使得 \(S, T\) 不连通,并且使得边权和尽量小. \(n \le 1000 ...

  3. 拯救大兵瑞恩 HDU - 4845(状压bfs || 分层最短路)

    1.状压bfs 这个状压体现在key上  我i们用把key状压一下  就能记录到一个点时 已经拥有的key的种类 ban[x1][y1][x2][y1]记录两个点之间的状态 是门 还是墙 还是啥都没有 ...

  4. JZOJ 3223. 【HBOI2013】Ede的新背包问题

    3223. [HBOI2013]Ede的新背包问题 (Standard IO) Time Limits: 2000 ms  Memory Limits: 262144 KB  Detailed Lim ...

  5. CF #640 (div4)

    CF640 div4 草 迟到半个月的补题 真正的懒狗 再懒就无了 D. Alice, Bob and Candies 题意:n个数字,奇数时间从左侧删数字,偶数时间从右侧删数字,每次删的数字之和必须 ...

  6. Codeforces Round #640 (Div. 4)

    比赛链接:https://codeforces.com/contest/1352 A - Sum of Round Numbers 题意 将一个十进制数的每一个非零位分离出来. 代码 #include ...

  7. Storyboards Tutorial 03

    这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...

  8. 文件图标SVG

    ​<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink ...

  9. Permutation test: p, CI, CI of P 置换检验相关统计量的计算

    For research purpose, I've read a lot materials on permutation test issue. Here is a summary. Should ...

  10. BZOJ3746 : [POI2015]Czarnoksiężnicy okrągłego stołu

    NOIP前做了几道POI,现在终于能在BZOJ上提交了… 交上去最后几个点WA,看了数据发现p=0的特判错了… p=0,1时特判 p=2时构造两种情况判断 p=3时不考虑1的座位进行DP 可以发现对于 ...

随机推荐

  1. Oracle体系结构和用户管理

    本篇博客将对Oracle的体系结构.存储结构.内存结构和进程结构进行初步介绍,从而从宏观上把握它的物理组成.文件组成和各种进程,对于进一步的了解可以起到很好地作用 一.Oralce体系结构 1.概述 ...

  2. devops 2024

    What is DevOps? DevOps is a mindset, a culture, and a set of technical practices. It provides commun ...

  3. macOS 和 Windows 操作系统下如何安装和启动 MySQL / Redis 数据库

    你好,我是 Kagol,个人公众号:前端开源星球(欢迎关注我,分享更多前端开源知识). TinyPro 后台管理系统的 NestJS 后端依赖 MySQL 和 Redis 数据库,本文主要带大家安装和 ...

  4. Asp.net mvc基础(十)判断是否是ajax请求

    通过Request.IsAjaxRequest()方法进行判断是否是ajax的请求,true是ajax的请求,false不是ajax的请求 后端: 前端: 效果: 使用Request.IsAjaxRe ...

  5. Linux四剑客grep、find、sed、awk使用

    ‌介绍 Linux四剑客‌是指在Linux系统中非常常用的四个命令工具,它们分别是grep.find.sed和awk.这四个工具在Linux系统中具有非常强大的功能,可以方便快捷地对文本进行搜索.处理 ...

  6. Cpu 资源占用高排查

    查看java进程 ps aux | grep java 或者 ps -ef | grep java 查看java进程 线程信息 使用top -p [PID] -H 观察该进程中所有线程的资源占用 to ...

  7. 关于php里怎么把字符串‘false’转成boolean的false

    都知道php里类型转换常用的是settype($str,'boolean')和(bool)$str 但是,他们将字符串'false'和'true'转成boolean后都是true,可能这不是我们需要的 ...

  8. WebSocket连接

    启动类增加注解并进行Bean注入 @EnableWebSocket @Bean public ServerEndpointExporter serverEndpointExporter() { ret ...

  9. 7.9K star!跨平台开发从未如此简单,这个开源框架让APP开发效率飙升!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Lynx 是一个革命性的跨平台开发框架,使用 TypeScript 开发即可同时构建 iOS ...

  10. 杂七杂八系列----浅谈.NET微服务架构的演变

    服务架构的演变 单体架构=>分布式架构=>SOA架构=>微服务架构=>Service Mesh=>Cloud Native 单体架构/垂直架构 分布式架构 SOA架构 微 ...