// 计算f[i][j]: i位且最高位为j的不降数个数 voidinit(){ for (int i = 0; i <= 9; i++) f[1][i] = 1; for (int i = 2; i < kN; 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; // 0也是不降低数 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; i--) { int x = nums[i]; for (int j = last; j < x; j++) { // < 左支叶只能到a_{n-1} res += f[i + 1][j]; } if (x < last) break; last = x; // 沿右走 if (!i) res++; } return res; }
constint kN = 11, kM = 105; int N; int f[kN][10][kM];
// cpp的取模运算与py等不同, cpp中-1 % 3 = -2 intmod(int x, int y){ return (x % y + y) % y; }
// 计算f[i][j][k]: i位, 最高位为j, 且所以数位山数的和为k的数个数 voidinit(){ memset(f, 0, sizeof f); // 每轮清空状态 for (int i = 0; i <= 9; i++) f[1][i][i % N] = 1; for (int i = 2; i < kN; i++) { for (int j = 0; j <= 9; j++) { for (int k = 0; k < N; k++) { for (int x = 0; x <= 9; x++) { f[i][j][k] += f[i - 1][x][mod(k - j, N)]; } } } } }
intdp(int n){ if (!n) return1; // 0 mod N 总等于0, 符合要求 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; i--) { int x = nums[i]; for (int j = 0; j < x; j++) { res += f[i + 1][j][mod(-last, N)]; } last = mod(last + x, N); if (!i && mod(last, N) == 0) res++; } return res; }
voidinit(){ for (int i = 0; i <= 9; i++) { if (i == 7) continue; auto &v = f[1][i][i % 7][i % 7]; v.s0++, v.s1 += i, v.s2 += i * i; } LL power = 10; for (int i = 2; i < kN; i++, power *= 10) { for (int j = 0; j <= 9; j++) { if (j == 7) continue; for (int a = 0; a < 7; a++) { for (int b = 0; b < 7; b++) { for (int k = 0; k <= 9; k++) { if (k == 7) continue; auto &v1 = f[i][j][a][b], &v2 = f[i - 1][k][mod(a - j * power, 7)][mod(b - j, 7)]; v1.s0 = mod(v1.s0 + v2.s0, N); v1.s1 = mod(v1.s1 + v2.s1 + j * (power % N) % N * v2.s0, N); v1.s2 = mod(v1.s2 + j * j * (power % N) % N * (power % N) % N * v2.s0 + 2 * j * power % N * v2.s1 + v2.s2, N); } } } } } power7[0] = power9[0] = 1; for (int i = 1; i < kN; i++) { power7[i] = power7[i - 1] * 10 % 7; power9[i] = power9[i - 1] * 10ll % N; } }
F get(int i, int j, int a, int b){ int s0 = 0, s1 = 0, s2 = 0; for (int x = 0; x < 7; x++) { for (int y = 0; y < 7; y++) { if (x != a && y != b) { auto v = f[i][j][x][y]; s0 = (s0 + v.s0) % N; s1 = (s1 + v.s1) % N; s2 = (s2 + v.s2) % N; } } } return {s0, s1, s2}; }
intdp(LL n){ if (!n) return0; LL bak_n = n % N; vector<int> nums; while (n) { nums.push_back(n % 10); n /= 10; } int res = 0; LL last_a = 0, last_b = 0; for (int i = nums.size() - 1; ~i; i--) { int x = nums[i]; for (int j = 0; j < x; j++) { if (j == 7) continue; int a = mod(-last_a * power7[i + 1], 7); int b = mod(-last_b, 7); auto v = get(i + 1, j, a, b); res = mod(res + (last_a % N) * (last_a % N) % N * power9[i + 1] % N * power9[i + 1] % N * v.s0 % N + 2 * last_a % N *power9[i + 1] % N * v.s1 + v.s2, N); } if (x == 7) break; last_a = last_a * 10 + x; last_b += x; if (!i && last_a % 7 && last_b % 7) res = (res + bak_n * bak_n) % N; } return res; }