[ABC134F] Permutation Oddness 题解
1.[PA2021] Od deski do deski 题解2.[TJOI2019] 甲苯先生的字符串 题解3.[ABC213G] Connectivity 2 题解
4.[ABC134F] Permutation Oddness 题解
5.[JSOI2018] 潜入行动 题解6.[TJOI2018] 游园会 题解T5 [ABC134F] Permutation Oddness
很无敌的一道题。(好像是我第一次用无敌这个词
把
那么设
考虑新遍历到一组球和盒子,会有三种情况出现:不给它们配对、给其中一个配对、给俩都配对。
情况一:不给它们配对。
则易得转移方程:
情况二:给其中一个配对。
- 如果给球配对,相当于用了之前的一个没有配对的盒子,有
种情况; - 如果给盒子配对,相当于用了之前的一个没有配对的球,有
种情况; - 还有一种特殊情况:直接将当前球和当前盒子配成一对,有
种情况。
综上,有
情况三:给俩都配对。
当前的球有
那么问题来了,为什么是
我们可以理解为:状态中的
这篇题解对
#include<bits/stdc++.h>
#define fw fwrite(obuf,p3-obuf,1,stdout)
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
#define putchar(x) (p3-obuf<1<<20?(*p3++=(x)):(fw,p3=obuf,*p3++=(x)))
using namespace std;
char buf[1<<20],obuf[1<<20],*p1=buf,*p2=buf,*p3=obuf,str[20<<2];
int read(){
int x=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x;
}
template<typename T>
void write(T x,char sf='\n'){
if(x<0)putchar('-'),x=~x+1;
int top=0;
do str[top++]=x%10,x/=10;while(x);
while(top)putchar(str[--top]+48);
if(sf^'#')putchar(sf);
}
using ll=long long;
constexpr int MAXN=55,MOD=1e9+7;
int n,K;
int dp[MAXN][MAXN][MAXN*MAXN];
void add(int&x,int y){
x=x+y>=MOD?x+y-MOD:x+y;
}
int main(){
n=read(),K=read();
if(K&1)return write(0),fw,0;
dp[0][0][0]=1;
for(int i=0;i<n;++i)
for(int j=0;j<=i;++j)
for(int k=0;k<=K;++k){
add(dp[i+1][j][k+2*j],(ll)dp[i][j][k]*(j<<1|1)%MOD);
if(j)add(dp[i+1][j-1][k+2*j],(ll)dp[i][j][k]*j%MOD*j%MOD);
add(dp[i+1][j+1][k+2*j],dp[i][j][k]);
}
write(dp[n][0][K]);
return fw,0;
}
即得易见平凡,仿照上例显然。留作习题答案略,读者自证不难。
反之亦然同理,推论自然成立。略去过程 ,由上可知证毕。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】