洛谷 P3413 SAC 1 萌數

2021-10-08 21:38:34 字數 1767 閱讀 6816

題意:求範圍內符合:至少有乙個回文子串的數的數量。

如果正著求,要考慮容斥,很麻煩,所以我們就求:「全部數量」 減去 「乙個回文子串都沒有的數的數量」。

如何做到乙個回文子串都沒有?

str[i]!=str[i-2] str[i]!=str[i-1]即可。

乙個回文子串都沒有的數的數量明顯是:solve(m)-solve(n-1)。

但是,我們需要求n-1? 高精度嗎?

其實只要:solve(m)-solve(n)。

然後判斷再判斷一下n就好了 。

#include

#define int long long

using

namespace std;

const

int n=

1e3+

5,mod=

1e9+7;

int len,sum1,sum2,sum,ans,now;

int a[n]

,dp[n][11

][11]

;char n[n]

,m[n]

;int

dfs(

int x,

int pre2,

int pre1,

int lead,

int limit)if(

!lead &&

!limit && pre2!=-10

&& pre1!=-10

&&~dp[x]

[pre2]

[pre1]

)int h;

if(limit) h=a[x]

;else h=9;

int res=0;

for(

register

int i=

0; i<=h;

++i)if(

!lead &&

!limit && pre1!=-10

&& pre2!=-10

)return res;

}inline

intsolve

(char x)

signed

main()

for(

register

int i=

1; i++i)

if(n[i]

==n[i-1]

)if(jay) now=

(now+1)

%mod;

sum1=0;

len=

strlen

(n);

for(

register

int i=

0; i++i) sum1=

(sum1*

10%mod+n[i]

-'0'

)%mod;

sum2=0;

len=

strlen

(m);

for(

register

int i=

0; i++i) sum2=

(sum2*

10%mod+m[i]

-'0'

)%mod;

sum=

((sum2-sum1+1)

%mod+mod)

%mod;

ans=

((sum-now)

%mod+mod)

%mod;

printf

("%lld\n"

,ans)

;return0;

}

洛谷P3413 SAC 1 萌數

題目大意 求 l,r 0 leqslant l題解 數字 dp 發現如果有回文串,若長度為偶數,一定有兩個相同的數字相鄰 若長度為奇數,一定有兩個相同的數字中間間隔乙個數字。所以只需要記錄前兩個數字就行了。注意判斷 l 是否符合條件。卡點 無 c code include include inclu...

洛谷 P3413 萌數

敲完這篇題解,我就,我就,我就,嗯,好,就這樣吧。首先我們要知道乙個回文串的性質 假如說乙個 l 1,r 1 的串是回文的,那麼 l,r 一定也是回文的。所以我們只要記錄前乙個數和前前乙個數就可以了,假如說當前數和他們 前乙個數和前前乙個數 當中的任意乙個相等,那麼它就一定是乙個萌數。知道了這些我們...

洛谷3413 萌數

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