洛谷 P3413 萌數

2022-05-31 08:54:08 字數 1876 閱讀 7607

敲完這篇題解,我就,我就,我就,嗯,好,就這樣吧。。。

首先我們要知道乙個回文串的性質——假如說乙個[l-1,r+1]的串是回文的,那麼[l,r]一定也是回文的。

所以我們只要記錄前乙個數和前前乙個數就可以了,假如說當前數和他們(前乙個數和前前乙個數)當中的任意乙個相等,那麼它就一定是乙個萌數。

知道了這些我們就可以開始設計狀態了。

dp[pos][pre1][pre2]表示當前找到pos位,前乙個數為pre1,前前乙個數為pre2時的萌數個數。

var

a:array[1..2000] of

integer;

dp:array[1..2000,0..9,0..9,0..1] of

int64;

len,i:longint;

ans,oo,t:int64;

l,r,st:ansistring;

function

dfs(pos,pre1,pre2,lead,flag,val:longint):int64;

vari,limit,x:integer;

res:int64;

begin

if pos>len then

exit(val);

if (pre2>=0)and(lead+flag=0)and(dp[pos][pre1][pre2][val]<>-1) then dfs:=(dp[pos][pre1][pre2][val]) else

begin

if flag=1

then limit:=a[pos] else limit:=9

; res:=0

;

for i:=0

to limit do

begin

if lead=1

then x:=-1

else x:=pre1;

res:=(res+dfs(pos+1,i,x,ord((lead=1)and(i=0)),ord((flag=1)and(i=limit)),ord((val=1)or((i=pre1)and(lead=0))or((i=pre2)and(lead=0)))))mod

oo;

end;

if (pre2>=0)and(lead+flag=0) then dp[pos][pre1][pre2][val]:=res;

dfs:=res;

end;

end;

begin

oo:=1000000007

; readln(st);

t:=pos('

',st);

l:=copy(st,1,t-1

); len:=length(l);

delete(st,

1,t);

for i:=1

to len do

a[i]:=ord(l[i])-48

;

while i>0

doif a[i]>0

then

begin dec(a[i]); break; end

else

begin a[i]:=9; dec(i); end

; fillchar(dp,sizeof(dp),

255);

ans:=dfs(1,-1,-1,1,1,0

); r:=st;

len:=length(r);

for i:=1

to len do

a[i]:=ord(r[i])-48

; ans:=((dfs(1,-1,-1,1,1,0)-ans)mod oo+oo)mod

oo; writeln(ans);

end.

洛谷P3413 萌數 數字dp

給出兩個len 1e3 len leq1e3 len 1e 3的數字串,然後求問兩個數字之間有多少個萌數,萌數的定義是存在長度至少為2 22的回文子串。答案對1e9 7 1e9 7 1e9 7取模。正難則反 計算不是萌數的個數,由高位往低位列舉,記錄下這一位的前一位和前兩位,保證當前位和前一位以及前...

洛谷3413 萌數

數字dp。因為我們知道如果有回文子串,一定有乙個回文的中心。我們只要能找到乙個滿足長度 geq 2 的回文中心就可以了。也就是說找到乙個滿足 a i a i 1 或 a i a i 2 的地方就是萌數了。但是還需要注意前導0的特殊處理 記憶化搜尋的狀態裡面負數的處理 有 1的情況可以所有情況 1儲存...

洛谷 P3413 SAC 1 萌數

題意 求範圍內符合 至少有乙個回文子串的數的數量。如果正著求,要考慮容斥,很麻煩,所以我們就求 全部數量 減去 乙個回文子串都沒有的數的數量 如何做到乙個回文子串都沒有?str i str i 2 str i str i 1 即可。乙個回文子串都沒有的數的數量明顯是 solve m solve n ...