P2602 [ZJOI2010] 数字计数

原题链接

题解

abcdefg等价于求
a000000+b00000+c0000+d000+e00+f0+g

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll ten[14]={0};
ll f[14]={0};
ll a1[14]={0},a2[14]={0};

void solve1(ll now)
{
    int len=0;
    ll pre=0;
    while(now)
    {
        ++len;
        int top=now%10;
        for(int i=0;i<top;i++)
        {
            a1[i]+=ten[len-1];
            for(int i=0;i<=9;i++) a1[i]+=f[len-1];
        }
        a1[top]+=pre+1;
        pre=top*ten[len-1]+pre;
        now/=10;
    }
    for(int i=len;i>=1;i--)
    {
        a1[0]-=ten[i-1];
    }
}

void solve2(ll now)
{
    int len=0;
    ll pre=0;
    while(now)
    {
        ++len;
        int top=now%10;
        for(int i=0;i<top;i++)
        {
            a2[i]+=ten[len-1];
            for(int i=0;i<=9;i++) a2[i]+=f[len-1];
        }
        a2[top]+=pre+1;
        pre=top*ten[len-1]+pre;
        now/=10;
    }
    for(int i=len;i>=1;i--)
    {
        a2[0]-=ten[i-1];
    }
}
int main()
{
    ten[0]=1;
    for(int i=1;i<=13;i++) ten[i]=ten[i-1]*10LL;
    f[1]=1;
    for(int i=2;i<=13;i++) f[i]=10LL*f[i-1]+ten[i-1];


    ll a,b;
    cin>>a>>b;
    solve1(b);
    solve2(a-1);
    for(int i=0;i<=9;i++) printf("%lld ",a1[i]-a2[i]);
    return 0;
}
posted @ 2024-03-21 22:50  纯粹的  阅读(13)  评论(0)    收藏  举报