bzoj1833 数字计数
2016-02-24 13:19
288 查看
Description
给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。Input
输入文件中仅包含一行两个整数a、b,含义如上所述。Output
输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。数位dp
c[i]表示长度为i的由0~9组成的串中每个字符的出现次数
F(x)计算与x位数相同且不大于x的数中每个字符的出现次数并累加到答案数组f
#include<cstdio> typedef long long lint; lint c[16]={0}; lint p10[16]={1}; lint l,r; lint f[16]; void F(lint x){ if(!x)return; int v[16],p=0; while(x)f[v[++p]=x%10]++,x/=10; for(int i=1;i<v[p];i++){ for(int j=0;j<=9;j++)f[j]+=c[p-1]; f[i]+=p10[p-1]; } for(int k=p-1;k>=1;k--){ for(int i=0;i<v[k];i++){ for(int j=0;j<=9;j++)f[j]+=c[k-1]; f[i]+=p10[k-1]; for(int j=p;j>k;j--)f[v[j]]+=p10[k-1]; } } } int main(){ for(int i=1;i<16;i++)p10[i]=p10[i-1]*10; for(int i=1;i<16;i++)c[i]=c[i-1]*10+p10[i-1]; scanf("%lld%lld",&l,&r); --l; F(l); for(int i=0;p10[i]-1<l;i++)F(p10[i]-1); for(int i=0;i<16;i++)f[i]=-f[i]; F(r); for(int i=0;p10[i]-1<r;i++)F(p10[i]-1); printf("%lld",f[0]); for(int i=1;i<=9;i++)printf(" %lld",f[i]); return 0; }
相关文章推荐
- AJAXdemo_sync.html Async = false
- [数据结构]One-Dimensional Life Game
- 让使用了SQLite的.NET应用自适应32位/64位系统
- ICPCCamp 2016 Day 6 - Spb SU and Spb AU Contest(Colored path-dp)
- 使用POI读取xls和xlsx
- sublime text ctags 不能正常跳转 can't find any relevent
- 主主+ lvs keepalived 配置文件
- C++设计模式-1简单工厂模式
- AFNetworking 3.0迁移指南
- java中Overload(重载)和Override(重写、覆盖)
- c语言入门之项目3.9——输出一个“空”三角形
- AJAXdemo.html
- bootstrapValidator不触发校验
- php empty和isset的比较
- MySQL主从复制结构中常用参数
- 排序——插入排序(insertionsort)
- 网络虚拟化是否需要额外的网络架构?
- Spring Mvc提交form表单上传文件
- SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"
- mysql主从同步(低版本)参数说明