Links there:BZOJ1026-windy数
题意
定义不含前导零且相邻两个数字之差至少为2的正整数被称为windy数.给出$A,B$,求在$A,B$之间windy数的个数.
思路
(别问我为什么这么晚才来补题)
令$f[i][j]$表示当前数字有$i$位,最高位取到$j$以下的满足条件的windy数.
很明显有转移$f[i][j] = \sum f[i-1][k] * (|k - j|>=2)$
预处理出$f[i][j]$后来迭代或者递归计算$x$以内的答案即可 注意细节讨论.
在计算$calc(x)$的时候,先处理$x$的位数和各数位的值.
令位数为$cnt$,当$i<=n-1$的时候直接统计.
$j = 最高位-1$ 独立计算一次 rep(j,1,a[cnt]-1) ret+=f[cnt][j];
对于剩余的位数$ret += f[i][j],cnt-1\geq i \geq 1 ,0 \leq j \leq a[i] - 1$.
然后要保证$|a[i]-a[i+1] |>= 2$,否则直接退出.
差不多就这样了.
1 | //my vegetable has exploded. :( |