小强向你请教了一个奇妙的数学题:给定两个数m和n,小强可以通过对n里面的数位进行重新排列。
例如对520中的数位重新排列后能得到:520,502,250,205,052,025六种不同的数。
此题如果使用暴力解法时间复杂度将会是阶乘级,肯定不满足,所以我们使用状压动态规划来解决此题.这里建议先学习前置知识:二进制集合操作
首先对于数n中的数为进行单独看待,最多有15个数位,同时m最大为100,将15个数位中的每一个数选择以及不选择的排列组合视作一个状态,并用二进制的形式压缩为整数表示,并对任意一个状态,统计对于m取模值为j的组合数量,即定义 f[i][j] 为在n中选了下标二进制集合为 i 且模 m 为 j 的数的组合数量。
状态的转移即为在所有的数位中挑选一个未曾选择的数位加入到数字的最后一位然后进行状态更新,可以证明此转移可以枚举到所有情况。
但是如此转移有一个错误,那就是会将所有数位都视作不同,但是实际情况如果数位中的数字相同那么这两个数位便相同,所以我们要进行去重,对于相同的数位,我们要除去相同数量的阶乘,这就是同一种数位之间位置的排列组合种数,相同数位位置的排列组合数字都是相同,被视作同一个数字
本题属于以下题库,请选择所需题库进行购买