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]<<" "; }