洛谷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;
}