class="markdown_views prism-github-gist">
问题
一个
m位的整数,有多少可以被整数
n整除?其中
m可以大于15。
分析1
这个问题显然不能穷举所有的情况。数论中的模加法运算有这样的性质(对乘法也是一样):
(a+b) mod n===(a mod n+b mod n) mod n(a mod n+b) mod n(a+b mod n) mod n
由此可见,一个数的取模问题可以拆分成两个求和数的取模问题,这显然属于动态规划能够解决的问题。对于一个
m位的整数
x,可以将其按照十进制拆解为
x=x0×10m−1+x1×10m−2+⋯+xm−2×10+xm−1。对于其中的
i−1和
i位做如下分析:
令
j=xi−1 mod n,则
(xi−1×10+xi) mod n====[(xi−1×10) mod n+xi] mod n{[(xi−1 mod n)×10] mod n+xi} mod n[(j×10) mod n+xi] mod n(j×10+xi) mod n
由此定义
c[i,j]为前
i位数模
n余数为
j的个数,原问题为
c[m,0]。第
i位的取值
k=0∼9,穷举一遍后前
i位余数为
(j∗10+k)%n的个数,等于前
i−1位余数为
j的个数的累计和。从而递归式为
{c[0,0]=1,c[i,j]=0,c[i,(j∗10