$ [Contest #4]$求和 思博题 正解: 解题报告:
解题报告:
一道看起来是数位$dp$其实并不是的题$QwQ$
首先求$sum_{l}^r$就变成$sum_1^r-sum_1^{l-1}$不说$QwQ$.现在就只要求$sum_{i=1}^n f(n)$了$QwQ$
考虑固定前缀,只改变个位数,因为个位数的贡献为1,所以$f$的贡献也会各不相同,又因为$fin[0,9]$,所以$[1,9],[10,19],[20,21],...$的贡献就都是45.
(开始呆呆$lq$还懵了一下,,,想着为啥不是$[1,10],[11,20],...$这样儿的.然后就想起了固定前缀$kk$
于是现在$sum_{i=1}^n f(n)$就变形为了,$45cdot frac{n+1}{10}+sum_{i=frac{n+1}{10}cdot 10}^n f(n)$
现在只要考虑求$sum_{i=frac{n+1}{10}cdot 10}^n f(n)$.
依然是前面说的,固定前缀后只有个位数改变时.因为个位数贡献为1,所以相差在不膜10的意义下也一定是1.
所以求一个其他递推出来就成$QwQ$
$over$
这题主要就是要发现关于这个$f$的几个奇奇怪怪的性质$QwQ$.
嗷记得开$ll$鸭
#include<bits/stdc++.h> using namespace std; #define il inline #define gc getchar() #define int long long #define ri register int #define rb register bool #define rc register char #define rp(i,x,y) for(ri i=x;i<=y;++i) #define my(i,x,y) for(ri i=x;i>=y;--i) int d[20]; il int read() { rc ch=gc;ri x=0;rb y=1; while(ch!='-' && (ch>'9' || ch<'0'))ch=gc; if(ch=='-')ch=gc,y=0; while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc; return y?x:-x; } il int f(ri x) { ri cnt=0;memset(d,0,sizeof(d)); while(x){d[++cnt]=x%10,x/=10;} while(cnt>1){rp(i,1,cnt-1)d[i]=(d[i]+d[i+1])%10;--cnt;while(!d[cnt] && cnt>0)--cnt;} return d[1]; } il int cal(ri x){ri d1=(x+1)/10,d2=d1*10,ret=f(d2),as=d1*45;while(d2<=x)as+=ret,(++ret)%=10,++d2;return as;} signed main() { //freopen("1076.in","r",stdin);freopen("1076.out","w",stdout); ri T=read(); while(T--){ri l=read(),r=read();printf("%lld ",cal(r)-cal(l-1));} return 0; }