[ZJOI2010]数字计数

[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;
}
原文地址:https://www.cnblogs.com/sdzwyq/p/9871645.html