[CF1538F] Interesting Function 的题解

题目大意

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

  • \(1 \le l < r \le 10^9\)

思路

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

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

假设一个数为 \(x\) 那么从 \(0\) 一直变化到 \(x\) 对于各位变化的次数就是 \(x\)

因为从 \(0\) 增加的 \(x\) 一共增加了 \(x\) 次。

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

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

因为走后会变成 \(x\),所以第 \(k\) 位一共会变换 \(\lfloor x/10^{k-1}\rfloor\)

\[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;
}
posted @ 2024-07-14 13:47  未抑郁的刘大狗  阅读(9)  评论(0编辑  收藏  举报