标签:
一个正整数的价值就是把这个数的十进制写出来之后,最长的等差子串的长度。
求出在[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枚举下一位的数字转移即可
1 const maxn=13; 2 var T:longint; 3 a:array[0..maxn] of longint; 4 f:array[0..maxn,0..maxn,0..maxn,-9..9,0..9,0..1,0..1] of int64; 5 function max(a,b:longint):longint; inline; 6 begin 7 if a>b then exit(a) else exit(b); 8 end; 9 function dfs(now,ml,l,d,pre,st,lim:longint):int64; 10 var mx,i:longint; sum:int64; 11 begin 12 //now 第now位 13 //ml 最长长度 14 //l 当前长度 15 //d 公差为d 16 //st 有无前导0 17 //pre 上一位是多少 18 //lim 是否达到上限 19 if f[now,ml,l,d,pre,st,lim]>0 then exit(f[now,ml,l,d,pre,st,lim]); 20 if now=0 then exit(ml); 21 if lim=1 then mx:=a[now] else mx:=9; 22 sum:=0; 23 for i:=0 to mx do 24 if st=1 then 25 if i=0 then 26 sum:=sum+dfs(now-1,0,0,i-pre,i,1,lim and ord(i=mx)) 27 else 28 sum:=sum+dfs(now-1,max(ml,l+1),l+1,i-pre,i,0,lim and ord(i=mx)) 29 else 30 if i-pre=d then 31 sum:=sum+dfs(now-1,max(ml,l+1),l+1,i-pre,i,0,lim and ord(i=mx)) 32 else 33 sum:=sum+dfs(now-1,max(ml,2),2,i-pre,i,0,lim and ord(i=mx)); 34 f[now,ml,l,d,pre,st,lim]:=sum; 35 exit(sum); 36 end; 37 function calc(x:int64):int64; 38 var len:longint; 39 begin 40 fillchar(f,sizeof(f),0); 41 len:=0; 42 while x>0 do 43 begin 44 inc(len); 45 a[len]:=x mod 10; 46 x:=x div 10; 47 end; 48 exit(dfs(len,0,0,0,0,1,1)); 49 end; 50 procedure main; 51 var l,r:int64; 52 begin 53 readln(l,r); 54 writeln(calc(r)-calc(l-1)); 55 end; 56 begin 57 readln(T); 58 while T>0 do begin main; dec(T); end; 59 60 end.
标签:
原文地址:http://www.cnblogs.com/rpSebastian/p/4558824.html