题意:求区间l,r中的数x 及其 x的约数最高位出现的次数

思路:
首先利用前缀和的思想将问题转化成求 [1,r] - [1,l-1]
题目是说求x的约数首位出现次数 自然就想到枚举因子 假设当前有因子a 则另一个边界显然就是x/a
将他们都假设成 L,R 所以问题变成了在L,R中 求最高位为出现的次数
而求L,R中的出现次数 我们可以通过枚举最高位和位数 右区间 - 左区间 + 1 将答案统计即可
过程量记得开LL 否则会炸int

#include <bits/stdc++.h>

using namespace std;

#define int long long

int ansl[15],ansr[15];

int get(int x)
{
    int res = 0;

    while(x > 0)
    {
        res = x% 10;
        x /= 10;
    }

    return res;
}

void check(int a[],int r)
{
    for(int i = 1;i * i <= r;i ++)
    {
        int b = r/i;

        for(int j = 1;j <= r;j *= 10)
        {
            for(int k = 1;k <= 9;k ++)
            {
                int x = max(j*k,i + 1);
                int y = min((j*(k + 1)) - 1,b);

                if(y - x >= 0)
                    a[k] += y - x + 1;
            }
        }

        int first = get(i);
        a[first] += b - i + 1;
    }
}

signed main()
{
    int l,r;

    scanf("%lld%lld",&l,&r);

    check(ansr,r);
    check(ansl,l - 1);

    for(int i = 1;i <= 9;i ++)
        printf("%lld\n",ansr[i] - ansl[i]);

    return 0;
}