voidinit(){ for (int i = 0; i <= 9; i++) f[1][i] = 1; for (int i = 2; i < N; i++) { for (int j = 0; j <= 9; j++) { for (int k = j; k <= 9; k++) { f[i][j] += f[i - 1][k]; } } } }
intdp(int n){ if (!n) return1; vector<int> nums; while (n) nums.push_back(n % 10), n /= 10; int res = 0; int last = 0; // 记录上一位数是几 for (int i = nums.size() - 1; i >= 0; i--) { int x = nums[i]; for (int j = last; j < x; j++) { res += f[i + 1][j]; } if (x < last) break; last = x; if (!i) res++; } return res; }
intmain(){ init(); int l, r; while (cin >> l >> r) { cout << dp(r) - dp(l - 1) << endl; } return0; }
constint N = 11; int f[N][10]; // f[i][j] 表示共 i 位,最高位是 j 的 windy 数的个数
voidinit(){ for (int i = 0; i <= 9; i++) f[1][i] = 1; for (int i = 2; i < N; i++) { for (int j = 0; j <= 9; j++) { for (int k = 0; k <= 9; k++) { if (abs(j - k) >= 2) { f[i][j] += f[i - 1][k]; } } } } }
intdp(int n){ if (!n) 0; vector<int> nums; while (n) nums.push_back(n % 10), n /= 10;
int res = 0; int last = -2; for (int i = nums.size() - 1; i >= 0; i--) { int x = nums[i]; for (int j = i == nums.size() - 1; j < x; j++) { // 首位不能填0 if (abs(j - last) >= 2) { res += f[i + 1][j]; } } if (abs(x - last) >= 2) last = x; else break; if (!i) res++; } for (int i = 1; i < nums.size(); i++) { for (int j = 1; j <= 9; j++) { res += f[i][j]; } } return res; }
int P; // 共 i 位,最高位为 j,各位相加再模 P 等于 k,这样的数的个数 int f[N][10][M];
intmod(int x, int y){ return (x % y + y) % y; }
// 预处理 f[i][j][k] voidinit(){ memset(f, 0, sizeof f); // 只有一位,枚举最高位 0~9 for (int j = 0; j <= 9; j++) { f[1][j][j % P]++; } for (int i = 2; i < N; i++) { for (int j = 0; j <= 9; j++) { for (int k = 0; k < P; k++) { for (int x = 0; x <= 9; x++) { // 注意这里范围是 0~9,因为位与位之间没有任何约束关系,所以能随便取,和不降数那个题有区别 f[i][j][k] += f[i - 1][x][mod(k - j, P)]; } } } } }
intdp(int n){ if (!n) { return1; } vector < int > nums; while (n) { nums.push_back(n % 10); n /= 10; } int res = 0; int last = 0; // 当前位之前所有位的和 for (int i = nums.size() - 1; i >= 0; i--) { int x = nums[i]; // 当前位选择 0 ~ x-1 的情况,进行累加 for (int j = 0; j < x; j++) { // 当前位选择填 j,要满足当前以及之后所有位相加的和为 -last 模 P,才能使整个数所有位相加模 P 为 0 res += f[i + 1][j][mod(-last, P)]; } last += x; if (!i && last % P == 0) { // 到达最后一位,且每位的和模 P 为 0,即这个数本身也是符合要求的 res++; } } return res; }
intmain(){ int l, r; while (cin >> l >> r >> P) { init(); cout << dp(r) - dp(l - 1) << endl; } return0; }