【洛谷 2602】数字计数
题目描述
给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。
输入格式
输入文件中仅包含一行两个整数a、b,含义如上所述。
输出格式
输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。
输入输出样例
输入 #1
1 99
输出 #1
9 20 20 20 20 20 20 20 20 20
说明/提示
30%的数据中,a<=b<=10^6;
100%的数据中,a<=b<=10^12。
题解:数位DP,见代码吧
#include<iostream> #include<algorithm> #include<queue> #include<cmath> #include<cstring> #include<cstdlib> #include<cstdio> using namespace std; typedef long long ll; ll a,b; ll ten[20],f[20]; ll fa[20],fb[20]; void solve(ll x,ll *f){ ll num[20]={0}; int len=0; while(x){ num[++len]=x%10; x=x/10; } for(int i=len;i>=1;i--){ for(int j=0;j<=9;j++) f[j]+=f[i-1]*num[i]; for(int j=0;j<num[i];j++) f[j]+=ten[i-1]; ll num2=0; for(int j=i-1;j>=1;j--) num2=num2*10+num[j]; f[num[i]]+=num2+1; f[0]-=ten[i-1]; } } void Yao_Chen_Lai_Le(){ scanf("%lld %lld",&a,&b); ten[0]=1; for(int i=1;i<=15;i++){ f[i]=f[i-1]*10+ten[i-1]; ten[i]=10*ten[i-1]; } solve(a-1,fa); solve(b,fb); for(int i=0;i<=9;i++) printf("%lld ",fb[i]-fa[i]); } int main(){ freopen("2602.in","r",stdin); freopen("2602.out","w",stdout); Yao_Chen_Lai_Le(); return 0; }