[abc309 G] Ban Permutation
G - Ban Permutation
首先看到绝对值,很烦,考虑取掉绝对值得到
然后我们就自然而然有了一个暴力的想法,设
这也太暴力了8,考虑优化
发现
然后我们又发现
所以我们考虑容斥,
然后考虑
那么
然后就可以完结撒花了 *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现