数字计数

传送门:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;
#define ll long long
#define re register
inline void read(int &a)
{
    a=0;
    int d=1;
    char ch;
    while(ch=getchar(),ch>'9'||ch<'0')
        if(ch=='-')
            d=-1;
    a=ch^48;
    while(ch=getchar(),ch>='0'&&ch<='9')
        a=(a<<3)+(a<<1)+(ch^48);
    a*=d;
}
ll ten[20],f[20],cnta[20],cntb[20],dig[20];
inline void init()
{
    ten[0]=1;
    for(re int i=1;i<=15;i++)
    {
        f[i]=f[i-1]*10+ten[i-1];
        ten[i]=10*ten[i-1];
    }
}
inline void solve(ll x,ll *cnt)
{
    int coutt=0;
    while(x)
    {
        dig[++coutt]=x%10;
        x/=10;
    }
    for(re int i=coutt;i>=1;i--)
    {
        for(re int j=0;j<=9;j++)
            cnt[j]+=f[i-1]*dig[i];
        for(re int j=0;j<dig[i];j++)
            cnt[j]+=ten[i-1];
        ll ans=0;
        for(re int j=i-1;j>0;j--)
            ans=ans*10+dig[j];
        cnt[dig[i]]+=ans+1;
        cnt[0]-=ten[i-1];
    }
}
int main()
{
    ll a,b;
    scanf("%lld %lld",&a,&b);
    init();
    solve(a-1,cnta);
    solve(b,cntb);
    for(re int i=0;i<=9;i++)
        printf("%lld ",cntb[i]-cnta[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/acm1ruoji/p/10878834.html