Description
Input
Output
Sample Input
7
1 10 2
1 20 3
1 100 0
10 20 4
20 30 5
1 10 9
11 100 9
Sample Output
9 15 100 5 3 9 1 思路:dp[i][j]表示前i位最高位是j的神奇的魔法数的个数,那么分别统计小于a,b+1 的神奇的魔法数的个数就对了#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int dp[15][10]; int m; void init(){ memset(dp,0,sizeof(dp)); for (int i = 0; i < 10; i++) dp[1][i] = 1; for (int i = 2; i < 12; i++) for (int j = 0; j < 10; j++) for (int k = 0; k < 10; k++) if (abs(j-k) >= m) dp[i][j] += dp[i-1][k]; } int solve(int n){ int bit[15] = {0},len = 0; while (n){ bit[++len] = n % 10; n /= 10; } int ans = 0; for (int i = 1; i < len; i++) for (int j = 1; j < 10; j++) ans += dp[i][j]; for (int i = 1; i < bit[len]; i++) ans += dp[len][i]; for (int i = len-1; i > 0; i--){ for (int j = 0; j < bit[i]; j++) if (abs(j-bit[i+1]) >= m) ans += dp[i][j]; if (abs(bit[i]-bit[i+1]) < m) break; } return ans; } int main(){ int l,r; int t; scanf("%d",&t); while (t--){ scanf("%d%d%d",&l,&r,&m); init(); printf("%d\n",solve(r+1)-solve(l)); } return 0; }