OI技术宅

Tech Otakus save the world!
Welcome,my dear friends!
【I'm kiana/kiana810@126.com】

【SCOI2007】排列

【题目描述】

给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0)。例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种。

【输入】

输入第一行是一个整数T,表示测试数据的个数,以下每行一组s和d,中间用空格隔开。s保证只包含数字0,1,2,3,4,5,6,7,8,9。

【输出】

每个数据仅一行,表示能被d整除的排列的个数。

【输入样例】

7

000 1

001 1

1234567890 1

123434 2

1234 7

12345 17

12345678 29

【数据范围】

20%的数据满足:s的长度不超过5, 1<=T<=5

50%的数据满足:s的长度不超过8

100%的数据满足:s的长度不超过10, 1<=d<=1000, 1<=T<=15

【题解】

很简单的一个状压DP,定义状态f[i][j]表示当前选择了i的二进制上为1的位置的数,对d取模后结果为j的方案总数,那么答案就是f[(1<<n)-1][0]。转移也很简单,直接枚举二进制中的每一位以及每个余数即可。

这道题还有一点需要注意,S中可能出现相同的数,因此最后的结果中要依次除以每个数出现次数的阶乘来消除影响。

【代码】

1A妥妥的~

http://paste.ubuntu.com/10837719/

评论

© OI技术宅 | Powered by LOFTER