P6 UVA11038 How Many O's?

UVA11308 How many O's

可以说很经典的数位DP。

但是有一种有趣的更快的做法:

将问题变化一下,如果对于第 i 位,把它变为 0 ,那么由于不能有前置 0 且保证构造出的数不能大于原数,所以比 i 大的位就是 1。额,不好说,比如要求 01145,那么假设现在使得 4 这一位为 0 了,那么前面能取的数无非就是 111,就是这个意思。还要注意判断前面如果取满了,如对应刚刚例子中的 11,那么后面就只能取 05了。

ll n,m; 

inline ll solve(ll x){
	if(x<0) return -1;
	ll res=0;
	ll t=0,p=1;
	while(x>=10){
		ll nx=x/10;
		res+=(nx-1)*p+((x%10)?p:(t+1));
		t+=x%10*p;
		p*=10,x/=10;
	} return res;
}

int main(){
  IOS
  while(cin>>n>>m&&n!=-1&&m!=-1)
		cout<<solve(m)-solve(n-1)<<'\n';
  return 0;
}

· EOF

posted @   ComplexityMFC  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示