How Many O's? UVA - 11038

发布时间 2023-04-19 20:15:55作者: towboat

写下区间[a,b]的所有数  ,问一共有多少个 0

 

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
#define int long long
int n,f[40][40][2][2] ;
 vector<int> a;
 
 int dfs(int x,int cnt0,int flg,int lead){
	if(x<0){
		if(lead) return 1; 
		return cnt0;
	}
	if(~f[x][cnt0][flg][lead] && lead==0 &&flg==0) 
		return f[x][cnt0][flg][lead]; 
	
	int end=flg?a[x]:9, t=0;
	for(int i=0;i<=end;i++){
		t+=dfs(x-1,cnt0+(i==0&&lead==0),flg&&i==end,lead&&i==0);
	}
	if(flg==0||lead==0) f[x][cnt0][flg][lead]=t;
	return t;
 }
 int sov(int x){
 	memset(f,-1,sizeof f); 
 	a.clear(); 
 	while(x){
 		a.push_back(x%10);
 		x/=10;
 	}
 	return dfs(a.size()-1,0,1,1);
 }
 signed main(){
 	int a,b;
 	while(cin>>a>>b){
 		if(a==-1&&b==-1) break;
 		cout<<sov(b)-sov(a-1)<<endl;
 	}
 }