P4163 [SCOI2007]排列

题面

P4163 [SCOI2007]排列

分析

蒟蒻真的真的不会搞如此高级的状压啊啊啊啊啊啊啊
于是一发爆搜打了50分
P4163 [SCOI2007]排列如果要打爆搜的话,要注意判重的问题
若是

000

的话,它的全排列(不管第一个1和第二个1是一样的)有6种,但实际这些都是重复的
于是我开了一个一亿的vis数组,(没怎么考虑空间开销),幸好没爆
但判重其实可以用一个比较巧妙的数学方法(正解也是这样),一开始统计每一个数出现的次数cnt[i],然后把结果依次除掉cnt[i]!cnt[i]!即可
其依据是,若某个数出现了i次,则长度为i,值全部是某个数的序列的全排列个数为i!i!,即原排列中每个数都被重复计算了i!i!次,于是直接除掉i!i!
(如3010012,cnt[0]=3,cnt[0]!=6,cnt[1]=2,cnt[1]!=2即全排列中3010012出现了cnt[0]×\timescnt[1]次,实际上只该有一次)
(下午再更~~)