欢迎来到SFWR的博客

P2602 [ZJOI2010]数字计数

题目描述

给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。

输入输出格式

输入格式:

 

输入文件中仅包含一行两个整数a、b,含义如上所述。

 

输出格式:

 

输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。

 

————————————————————————————————————

对每一位的统计,维护两个数组

 

#include<bits/stdc++.h>
using namespace std;
long long int cnta[9],cntb[9],f[13],ten[13],a,b;
void work1(long long int nt)
{
    long long int num[13]={0},len=0;
    while(nt){num[++len]=nt%10;nt=nt/10;}
    for(int i=len;i>=1;i--)
    {
    for(int j=0;j<=9;j++)cnta[j]+=f[i-1]*num[i];
    for(int j=0;j<num[i];j++)cnta[j]+=ten[i-1];
    long long ans=0;
    for(int j=i-1;j>=1;j--)ans=ans*10+num[j];
    cnta[num[i]]+=ans+1;
    cnta[0]-=ten[i-1];
    }
}
void work2(long long int nt)
{
    long long int num[13]={0},len=0;
    while(nt){num[++len]=nt%10;nt=nt/10;}
    for(int i=len;i>=1;i--)
    {
    for(int j=0;j<=9;j++)cntb[j]+=f[i-1]*num[i];
    for(int j=0;j<num[i];j++)cntb[j]+=ten[i-1];
    long long ans=0;
    for(int j=i-1;j>=1;j--)ans=ans*10+num[j];
    cntb[num[i]]+=ans+1;
    cntb[0]-=ten[i-1];
    }
}
int main()
{
    ten[0]=1;
    for(int i=1;i<=12;i++){f[i]=i*ten[i-1];ten[i]=ten[i-1]*10;}
    for(int i=1;i)
    cin>>a>>b;
    work1(a-1);
    work2(b);
    for(int i=0;i<=9;i++)
    cout<<cntb[i]-cnta[i]<<" ";
}

 

posted @ 2019-05-22 20:57  SFWR  Views(135)  Comments(0Edit  收藏  举报