内部胡策
A. Beautiful
垃圾出题人出垃圾膜数卡了垃圾做题人的垃圾组合数
eee 一个很显然的东西是肯定要求错排
然后发现除了第一行都是求一个n的错排
这个东西很好求,直接递推就完了
对于求字典序一个很套路的做法就是去找到当前位比它小的 然后乘上后面的都随便放的方案数
然后这个题要求的就是求出来每一行比当前行字典序小的有多少种方案
然后用这个东西去乘下面的行随便放(错排的n-i次方
所以考虑枚举某一行的每一列, 前面都和给定一样,当前列放比给定的小的数
但是发现后面的方案不能很好的处理 因为放完当前列后是一个形如有\(x\)个位置,\(y\)个限制的方案数
这个东西直接求显然很不对劲 考虑dp去求这个东西
令\(dp(i,j)\)表示有\(i\)个位置,\(j\)个限制的方案数
考场打了个表发现\(dp(i,j) = dp(i-1,j-1) + dp(i,j+1)\)
然后直接就冲了
考虑实际意义的话
\(dp(i,j)\)表示前\(j\)个数是有限制的,考虑第\(j+1\)个数放在哪里,如果第\(j+1\)个数放在了\(j+1\)的位置,那此时的子问题是\(dp(i-1,j-1)\),如果\(j+1\)个数不放在\(j+1\)的位置,那么现在就是一个\(i\)个数,\(j+1\)个限制的错排,所以转移就可以了
然后考虑求方案
假设此时在\(i\)行\(j\)列
考虑第j个数,肯定只能放比当前数小的且前面没有出现过的数,也就是可以放后面的比它小的数
这个东西可以用树状数组很好的维护,注意判断当前列上一行是否与其冲突就行
限制的话可以转化为,后面的同时在上下两行的数的个数
这个东西也可以随便维护, 但是当前位置是可能对后面造成影响的
所以限制是分两种的, 考虑怎么求当前位置对后面造成影响的方案数
可以理解为后面有多少个限制是满足小于当前位置的 所以也用个树状数组维护就可以了
然后需要注意的一个东西是膜数非质数所以不能求逆元
B.Exchange
观察题目的区间 发现给的很诡异
然后发现如果以\(2^k\)为整体区间的话, 那么每个给定的区间一定是一个整区间
所以直接冲个线段树就可以了 把大小调到\(2^k\) 动态开点
C.Embedding Enumeration
dp
大力分情况讨论
定义\(f(i)\)为\(i\)放在左上角合法的方案数
所以答案就是要求\(f(1)\)
分成当前点有几个儿子, 每个儿子怎样放, 是否有度大于2的儿子, 儿子是否拐弯然后回到了自己下面 讨论