洛谷P7199 [COCI 2019/2020 #1] Trol 题解

本题做法

  • 数学。

思路

本题中,不难发现,一个数的各个数位之和(直到只有个位数),等于它模上 9(但是若它本身就是 9 的倍数,那么就是 9),即:记 \(S(n)\) 为各个数位之和(直到个位数),那么:

\[S(n)=\begin{cases}n\bmod 9&\text{if } n\bmod 9\neq 0 \text{ or }n= 0\\9&\text{if }n\bmod 9=0 \text{ and } n\neq 0\end{cases} \]

那么题目就变成了求:

\[\sum_{i=l}^r S(i) \]

但是我们直接枚举,时间复杂度为 \(O(Q\times(r-l+1))\),会超时。

我们枚举几个 \(S(i)\)0 1 2 3 4 5 6 7 8 9 1 2 3 …,发现呈一个 1 2 3 4 5 6 7 8 9 的长 9 的周期,那么我们可以使用周期问题的方法,求出周期数(用 \(\lfloor \dfrac{r-l+1}{9}\rfloor\) 求),乘上周期的总和 45,再加上残缺区间的 \(S(n)\),就可以用 \(O(Q\times ((r-l+1)\bmod 9))\) 的时间复杂度求出答案,完全可以过这题。

代码

#include<bits/stdc++.h>

typedef long long ll;
typedef unsigned long long ull;

using namespace std;

int main(){
    int Q;
    cin>>Q;
    while(Q--){
        ll l,r,s=0;
        cin>>l>>r;
        s=(r-l+1)/9*45;
        for(ll i=l+(r-l+1)/9*9;i<=r;i++) {
            if(i%9==0) s+=9;
            else s+=i%9;
        }
        cout<<s<<endl;
    }
    return 0;
}
posted @ 2025-07-09 21:27  2789617221guo  阅读(53)  评论(0)    收藏  举报