4
计算 calc
4.1
问题描述
求满足以下条件的数 x 的个数模 m :
n 位数
各位数字不大于 k
x ≡ p (mod d)
4.2
输入格式
一行 5 个数:k,n,d,p,m 。
4.3
输出格式
一行一个数,表示个数模 m 。
4.4
样例输入
5 4 3 1 100007
4.5
样例输出
208
4.6
数据规模
对于 30% 的数据:n ≤ 5
对于 70% 的数据:n ≤ 1000
对于 100% 的数据:n ≤ 10^18,0 ≤ p < d ≤ 10,1 ≤ k ≤ 9
看起来很难的样子。考试的时候我打表找规律矩阵乘法过了 50 分(分类讨论太多没写完)。
其实不难发现这道题得七十分还是相当容易的:数位 dp 。事实上我一开始根本就没往那方面去想。
如何 dp 呢?可以考虑每一位上枚举数字,然后得到取模,再往下转移。即(转出):
f[i + 1][(j * 10 + j ') % d] = Σ f[i][i][j '],其中 j 为所枚举的下一位 mod d 的余数,j ' 为所枚举的当前位数字。
正确性很显然。假设 1111 mod d = 1, 那么 (1 * 10 + j) % d = 1111j % d,对于所有的 j 往其转移即可(我觉得转出比较方便取模)。
那剩下的 30 分呢?再仔细观察算式,不难发现:
对于每一个给定的 j,