题目大意
略
解题思路
可以逐位考虑当前数位上数字为1时的数字数量然后累加起来,因为每次只考虑当前数位的贡献,所以在计算过程中不存在重复的问题。
举个例子,比如1361092,我们用x代替0~9十个数字。
1.对于当前位的数字,如果大于1,比如说9的情况,那么十位为1的数字,也就是1x - 136101x就有((13610+1) imes 10))个,其中13610是比十位更高的数字,加上的1是当前十位上的1,为什么还乘十呢?因为后面有1个x,代表后面可以有10种数字。
2.如果等于0呢?和第一种情况类似,不过需要向前借1,比如到了百位,就是1xx-13601xx,贡献就是((1361-1+1) imes 100))。
3.如果是1呢?这时候我们发现,加入1后面如果不全是9,是取不到上面那么多数的,比如1xxx-1361092,后者取到1092就结束了,不可能到9999,那么还采用第2种方法,向前借1,1xxx-1351xxx肯定是都能取到了,剩下的就是1361000-1361092了,这里取模就行了,所以贡献就是((136-1+1) imes 1000 + 1361092%1000))。
代码
int main() {
ll n; cin >> n;
ll mul = 1, m = n, ans = 0;
while(n) {
ll res = n%10;
if (res>1) ans += (n/10+1)*mul;
else if (!res) ans += n/10*mul;
else ans += n/10*mul+m%mul+1;
mul *= 10; n /= 10;
}
cout << ans << endl;
return 0;
}