递归+分治
题目大意
解题思路
q − p q - p q−p 可能高达 2 31 2^{31} 231,如果暴力做的话会超时。因此要根据 p p p 和 q q q 之间的范围,分而治之进行优化。
-
若 q − p < 0 q - p < 0 q−p<0,根据递归函数的定义直接求。
-
若 q − p ≥ 9 q - p \ge 9 q−p≥9,则分析递归函数 F ( n ) F(n) F(n)。
解题技巧
如区间为 [ 2 , 53 ] [2, 53] [2,53] 时,求 [ 2 , 9 ] [2, 9] [2,9] 和 [ 51 , 53 ] [51, 53] [51,53] 的个位数和的写法:
while (l % 10) {
ans += l % 10;
l++;
}
while (r % 10) {
ans += r % 10;
r--;
}
注意事项
1.记得开 l o n g l o n g long \ long long long。
参考代码
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<deque>
#include<map>
#include<set>
#include<stack>
//#define LOCAL //提交的时候一定注释
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
typedef long long LL;
using namespace std;
const int maxn = 1e3 + 10;
const int MOD = 1e9 + 7;
int readint() {
int x; scanf("%d", &x); return x;
}
LL ans;
LL f(LL x) {
if (x % 10 > 0) return x % 10;
else if (!x) return 0;
else return f(x / 10);
}
void solve(LL l, LL r) {
// if (!l && !r) return;
if (r - l < 9) {
for(int i = l; i <= r; i++) {
ans += f(i);
}
return;
}
while (l % 10) {
ans += l % 10;
l++;
}
while (r % 10) {
ans += r % 10;
r--;
}
ans += 45 * (r - l) / 10;
solve(l / 10, r / 10);
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
LL p, q;
while (~scanf("%lld%lld", &p, &q) && p != -1) {
ans = 0;
solve(p, q);
printf("%lld\n", ans);
}
return 0;
}