题目描述
SSY是班集体育委员,总喜欢把班级同学排成各种奇怪的队形,现在班级里有 \(N\) 个身高互不相同的同学,请你求出这 \(N\) 个人的所有排列中任意两个相邻同学的身高差均不为给定整数 \(M\) 的倍数的排列总数。
输入格式
共三行:
第一行为 \(N\)
第二行为 \(N\) 个不同的整数
第三行为 \(M\)
输出格式
一行,为符合条件的排列总数(答案对 \(1234567891\) 取余数)。
输入样例
3
-1 0 1
2
输出样例
2
思路
先把题目转化一下:
给一些数和一个模数,这些数模上这个模数结果相同的分为一类
同类数不能相邻,问有多少种排列方式
易知同一类数的效果在序列中是一样的,可以将他们直接视为一种
差异只存在于数的大小不同,在最后乘上一个各个种类数字个数阶乘的乘积就行
设 \(f[i][k]\) 表示已经遍历到第 \(i\) 位,此时最后一个数字还剩下 \(k\) 个
可以用 hash 存每种颜色的状态,但是 map 套 vector 确实方便
转移的时候只用遍历每种状态的剩余种类进行转移就好
需要注意的是得钦定一个和 \(k\) 大小相同的种类为最后一个,不对它进行转移