Description
给出一个区间 [L,R] ,问其中首尾数字相同的数字有多少个
Input
两个正整数 L,R(1≤L≤R≤1018)
Output
输出区间 [L,R] 中首尾相同的数字个数
Sample Input
2 47
Sample Output
12
Solution
考虑求出
1
~
对于长度
l<m
的数字,其首尾
1
~
对于长度
l=m
但最高位小于
n
的最高位
对于长度
l=m
且最高位等于
x
的数字,如果
综上,如果 y≥x ,答案为 10m−2+8+(x−1)⋅10m−2+⌊n10⌋−x⋅10m−2+1=⌊n10⌋+9 ,否则答案为 ⌊n10⌋+8
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
ll Solve(ll n)
{
if(n<10)return n;
int x=n%10,y;
ll nn=n;
while(nn>=10)nn/=10;
y=nn;
if(x>=y)return n/10+9;
return n/10+8;
}
int main()
{
ll L,R;
while(~scanf("%I64d%I64d",&L,&R))printf("%I64d\n",Solve(R)-Solve(L-1));
return 0;
}