D-Function§
通过打表可以发现一个规律,假如一个数字满足每一位乘上
k不会进位,那么这个数字也就满足题目给出的等式。那么就是一个简单的组合数学问题了,对于一个给定的
x,想求出满足 \(a<10^x\) ,的满足上方等式的数字的个数,只需要在每一位任意填小于9 / k + 1的数字即可。每一位都有这么多方案,那么整合起来就应该是 \((\left \lfloor \frac{9}{k} \right \rfloor + 1)^x\) 个合法方案。
x范围很大,这里可以用快速幂来计算。#include <bits/stdc++.h> using i64 = long long; void solve() { int l, r, k, mod = 1e9 + 7; std::cin >> l >> r >> k; auto get = [&](int u) -> i64 { i64 res = 1, p = 9 / k + 1; while (u > 0) { if (u & 1) res = (res * p) % mod; p = (p * p) % mod; u >>= 1; } return res; }; std::cout << (get(r) - get(l) + mod) % mod << '\n'; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t; std::cin >> t; while (t--) { solve(); } return 0; }