一个正整数的价值就是把这个数的十进制写出来之后,最长的等差子串的长度。

求出在[l,r]范围内的数字的价值总和。

(l<=r<=10^12)

记f[now,ml,l,d,pre,st,lim] 为当前状态下ans的值

now   第now位
ml    所求的的等差数列最长长度
l          当前所求等差数列的长度
d          公差为d
st         有无前导0
pre       上一位是多少
lim        是否达到数字上限

直接dfs枚举下一位的数字转移即可

 const maxn=;
var T:longint;
a:array[..maxn] of longint;
f:array[..maxn,..maxn,..maxn,-..,..,..,..] of int64;
function max(a,b:longint):longint; inline;
begin
if a>b then exit(a) else exit(b);
end;
function dfs(now,ml,l,d,pre,st,lim:longint):int64;
var mx,i:longint; sum:int64;
begin
//now 第now位
//ml 最长长度
//l 当前长度
//d 公差为d
//st 有无前导0
//pre 上一位是多少
//lim 是否达到上限
if f[now,ml,l,d,pre,st,lim]> then exit(f[now,ml,l,d,pre,st,lim]);
if now= then exit(ml);
if lim= then mx:=a[now] else mx:=;
sum:=;
for i:= to mx do
if st= then
if i= then
sum:=sum+dfs(now-,,,i-pre,i,,lim and ord(i=mx))
else
sum:=sum+dfs(now-,max(ml,l+),l+,i-pre,i,,lim and ord(i=mx))
else
if i-pre=d then
sum:=sum+dfs(now-,max(ml,l+),l+,i-pre,i,,lim and ord(i=mx))
else
sum:=sum+dfs(now-,max(ml,),,i-pre,i,,lim and ord(i=mx));
f[now,ml,l,d,pre,st,lim]:=sum;
exit(sum);
end;
function calc(x:int64):int64;
var len:longint;
begin
fillchar(f,sizeof(f),);
len:=;
while x> do
begin
inc(len);
a[len]:=x mod ;
x:=x div ;
end;
exit(dfs(len,,,,,,));
end;
procedure main;
var l,r:int64;
begin
readln(l,r);
writeln(calc(r)-calc(l-));
end;
begin
readln(T);
while T> do begin main; dec(T); end; end.

Digit (数位DP)的更多相关文章

  1. BNUOJ 52325 Increasing or Decreasing 数位dp

    传送门:BNUOJ 52325 Increasing or Decreasing题意:求[l,r]非递增和非递减序列的个数思路:数位dp,dp[pos][pre][status] pos:处理到第几位 ...

  2. hdu 5898 odd-even number 数位DP

    传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...

  3. hdu3555 数位dp

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Subm ...

  4. codeforces Hill Number 数位dp

    http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits: ...

  5. hdu2089 数位dp

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. 【BZOJ-4521】手机号码 数位DP

    4521: [Cqoi2016]手机号码 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 303  Solved: 194[Submit][Status ...

  7. 【BZOJ-1026】windy数 数位DP

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5230  Solved: 2353[Submit][Sta ...

  8. 【BZOJ-1833】count数字计数 数位DP

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][ ...

  9. 【学习笔记&训练记录】数位DP

    数位DP,即对数位进行拆分,利用数位来转移的一种DP,一般采用记忆化搜索,或者是先预处理再进行转移 一个比较大略的思想就是可以对于给定的大数,进行按数位进行固定来转移记录答案 区间类型的,可以考虑前缀 ...

随机推荐

  1. ScrollView嵌套StackView提示需要宽度和高度限制

    场景: 在一个xib的view中,添加一个ScrollView,再在这个ScrollView中添加一个StackView,StackView中不加控件(用代码动态加). 问题: 提示ScrollVie ...

  2. Android存储数据方式

    可以查看Android开发文档中的:/docs/guide/topics/data/data-storage.html Android provides several options for you ...

  3. DataTable 中Distinct操作

    DataTable dt = ds.Tables[]; DataView dataView = dt.DefaultView; DataTable dtDistinct = dataView.ToTa ...

  4. PowerDesigner生成SQL脚本时,对象带有双引号的问题解决

    在pdm查看脚本时,发现表名和字段名带有双引号: 1.create table"cfg_user_card_account"  ( 2.  "user_card_acco ...

  5. DOM节点-appendChild

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  6. Windows 下对目录建立软链接

    在Linux下,可以很方便的通过ln命令创建对文件和对文件夹的软链接.在Windows下,通过快捷方式,可以创建到文件和文件夹的链接,但是这软链接不是一个层面的上东西.软链接是底层文件系统层面的,而快 ...

  7. (转)虚拟机的桥接模式和NAT模式区别

    不管是虚拟机的桥接还是NAT都是占用实机网络的.只不过两种方式有些差异,在通过IP或者拨号连接限速的网络中,差异就很明显了     举个不太恰当但简单的例子,一个百兆的网卡你可以把它想象成一个100车 ...

  8. php安装出现的部分错误

    在CentOS编译PHP5的时候有时会遇到以下的一些错误信息,基本上都可以通过yum安装相应的库来解决.以下是具体的一些解决办法: checking for BZip2 support… yes ch ...

  9. JAVA传智 DAY1复习

    Java平台: Java API JVM 特点:可跨平台 Java运行机制: 编译(javac.exe)                                  运行(java.exe) J ...

  10. Problem B 队列

    Description Two bored soldiers are playing card war. Their card deck consists of exactly n cards, nu ...