题目大意

给定两个正整数 l,rl, r,将 ll 不断加 11 直到 l=rl = r,求出这一过程中 ll 发生变化的位数总数。

  • 1≤l<r≤1091 \le l < r \le 10^9。

思路

假设从 ll 处理到 rr 变化的次数为 f(l,r)f(l,r)。

因为直接求解出 f(l,r)f(l,r) 十分困难,所以可以通过求出 f(0,l)f(0,l) 和 f(0,r)f(0,r) 最后做差得到。

假设一个数为 xx 那么从 00 一直变化到 xx 对于各位变化的次数就是 xx。

因为从 00 增加的 xx 一共增加了 xx 次。

而每当他增加一次,这个数的个位就会变化一次。

考虑从后向前数第 kk 为,假设增加一次为 10k−110^{k-1},那么随着每增加一次,第 kk 位就会变化一次。

因为走后会变成 xx,所以第 kk 位一共会变换 ⌊x/10k−1⌋\lfloor x/10^{k-1}\rfloor。

f(0,l)=∑i=0(log⁡10l)−1⌊l/10i⌋f(0,l)=\sum _{i=0}^{(\log_{10}l)-1} \lfloor l/{10^i}\rfloor

AC Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=50;
char a[N],b[N];
void solve(){
	int ans=0;
	cin>>a+1>>b+1;
	int n=strlen(a+1),m=strlen(b+1);
	for(int i=1,x=0;i<=n;i++){
		x=x*10+a[i]-48;
		ans-=x;
	}
	for(int i=1,x=0;i<=m;i++){
		x=x*10+b[i]-48;
		ans+=x;
	}
	cout<<ans<<'\n';
}
signed main(){
	int T;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}