[ZJOI2010]数字计数
BZOJ
luogu
对每个数字k做一遍数位dp
设f[i][j]表示满足最高位到第i+1位有j个数字k的所有数一共有多少个数字k
复杂度:(O(10^2×13^2))
#define ll long long
#include<bits/stdc++.h>
using namespace std;
int w[13],len;
ll a,b,ans[10],f[13][13];
void init(ll x){
len=0;
while(x){w[++len]=x%10;x/=10;}
}
ll dfs(int p,int d,bool lim,bool zero,int s){
if(!p)return s;
if(!lim&&!zero&&f[p][s]!=-1)return f[p][s];
int up=lim?w[p]:9;ll res=0;
for(int i=0;i<=up;i++){
bool k=zero&&!i;
res+=dfs(p-1,d,lim&&(i==up),k,s+(!k&&i==d));
}
return (!lim&&!zero)?f[p][s]=res:res;
}
int main(){
memset(f,-1,sizeof(f));
cin>>a>>b;
init(b);
for(int i=0;i<=9;i++)ans[i]+=dfs(len,i,1,1,0);
init(a-1);
for(int i=0;i<=9;i++)ans[i]-=dfs(len,i,1,1,0);
for(int i=0;i<=9;i++)cout<<ans[i]<<' ';cout<<endl;
return 0;
}