这道题巨佬们都是用数位 dp 来做的……
好的我们来考虑一下当一个数 + 1 +1 +1 时变化的位数。
- 0 + 1 = 1 0+1=1 0+1=1,变化为 1 1 1
- 9 + 1 = 10 9+1=10 9+1=10,变化为 2 2 2
- 99 + 1 = 100 99+1=100 99+1=100,变化为 3 3 3
显然,进位后有多少 0 0 0,就会改变零的个数 + 1 +1 +1 个数位。
显然,对于每两个正整数 n n n 和 m m m,在 n n n 以内能被 m m m 整除的数的个数为 n m \displaystyle{\frac{n}{m}} mn。
所以,我们只要暴力枚举从 1 0 0 10^0 100 到 1 0 9 10^9 109(以 k k k 表示),使用容斥原理计算 a a a 至 b b b 的能被这个数整除的数的个数。
或者,就是 b k − a k \displaystyle{\frac{b}{k}-\frac{a}{k}} kb−ka。
时间复杂度 O ( log 10 n ) O(\log_{10} n) O(log10n),完全可以。
附上我的丑陋代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int t;
cin >> t;
while(t--){
int a, b;
cin >> a >> b;
int ans = 0;
ans += b / 1 - a / 1;
ans += b / 10 - a / 10;
ans += b / 100 - a / 100;
ans += b / 1000 - a / 1000;
ans += b / 10000 - a / 10000;
ans += b / 100000 - a / 100000;
ans += b / 1000000 - a / 1000000;
ans += b / 10000000 - a / 10000000;
ans += b / 100000000 - a / 100000000;
ans += b / 1000000000 - a / 1000000000;
cout << ans << endl;
}
return 0;
}