calc 计算 题解(矩阵乘法优化动态规划)

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,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值