递归+分治 UVA10994 Simple Addition

递归+分治

F - Simple Addition

题目大意

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ADdhNiFP-1610952835911)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210118144620337.png)]

解题思路

q − p q - p qp 可能高达 2 31 2^{31} 231,如果暴力做的话会超时。因此要根据 p p p q q q 之间的范围,分而治之进行优化。

  • q − p < 0 q - p < 0 qp<0,根据递归函数的定义直接求。

  • q − p ≥ 9 q - p \ge 9 qp9,则分析递归函数 F ( n ) F(n) F(n)
    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BhJozzM9-1610952835915)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210118144925919.png)]
    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Bsd9WKB-1610952835915)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20210118144935278.png)]

解题技巧

如区间为 [ 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;
}

猜你喜欢

转载自blog.csdn.net/Encore47/article/details/112781801