不知道咕了多长时间的题。。。
讲了3遍,还是自己搞懂了。。
暂时没有找到题目链接
题意:
n×m的网格,每个格子填[1,x]的数,使得不存在两行两列同构。
先保证一个,行相同。
再容斥掉列。
枚举至多可以分成k个等价类。S表示第二类斯特林数
$ans=\sum_{k=1}^{m}C(x^k,n)\times S(m,k)\times (-1)^{m-k}$
为了使得每个方案,假设有t个实际列的等价类,使得被统计的$2^{m-k}$(就是每个相邻的列能否合并成一个等价类)配上系数,$\sum_{i=0}^{m-t}C(m-t,i)\times (-1)^{m-t-i}=0$
所以注意这里是$(-1)^{m-k}$
upda:2019.7.8
上面除了题意都在fp
感谢Vixbob提出写错了,发现是理解大错特错了
令(n,m,x)(表示n行m列填[1,x]时候的问题)
考虑定义g[m]表示(n,m,x)并且随意填且行相同,
显然g[m]=C(x^m,n)*n!
定义f[m]表示(n,m,x)的答案
有$g[m]=\sum_{i=1}^m S(m,i)f[i]$
为什么统计了$S(m,i)$次?
考虑钦定对应关系。每个$g[m]$划分出等价类之后,每个等价类按第一次出现顺序拼在一起,构成一个$f[i]$
每个$f[i]$一定会被统计$S(m,i)$次
然后斯特林反演即可
保证行相等,
列同构?等价类?
考虑随便填包含了哪些真实的答案。发现就是斯特林数作为系数。
列用斯特林反演。
然后题目连接:https://vjudge.net/problem/TopCoder-13444