乱搞qwq
我们其实可以找规律,对于每个数$x$,我们先求出从$1$~$x$中有多少符合条件的,记为$sum[x]$,那么类似于前缀和,答案自然就是$sum[r]-sum[l-1]$了
那么怎么求出$sum[x]$呢,我们思考两情况:
$1、$位数为$1$,也就是$x<=9$,这种情况的话,不用说了。。就是$x$。
$2、$位数大于$1$,这种情况的话,我们会发现,如果想要个位与最高位相同,那么每十个数才会有且只有一个数符合要求,为什么呢?举个例子:当现在最高位是百位且为$2$时,那么个位也必须是$2$,所以符合要求的就是$202,212,222,232......$看出来了吗,这也就是为什么十个数中必定且只有一个数符合要求
但是,这还没完!
我们还要考虑一种情况:
假设$x$是$332$的时候,我们会发现我们把$333$算了进去,所以当最高位大于最低位时,要减去$1$
那么思路讲完了,代码如下:
#include<iostream> #include<cstdio> #define ll long long using namespace std; ll l,r; ll Get(ll x) { if(x<=9) return x; ll ge=x%10,ans=x/10+9,now=x; while(now>=10) now/=10; if(now>ge) --ans; return ans; } int main() { scanf("%lld%lld",&l,&r); printf("%lld",Get(r)-Get(l-1)); return 0; }