洛谷P3413 萌數 數字dp

2021-09-26 21:23:27 字數 994 閱讀 3730

給出兩個len

≤1e3

len\leq1e3

len≤1e

3的數字串,然後求問兩個數字之間有多少個萌數,萌數的定義是存在長度至少為2

22的回文子串。答案對1e9

+7

1e9+7

1e9+

7取模。

正難則反:計算不是萌數的個數,由高位往低位列舉,記錄下這一位的前一位和前兩位,保證當前位和前一位以及前前一位始終不同。

#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const ll inf=long_long_max;

const int n=1e3+7;

const int mod=1e9+7;

char l[n],r[n];

ll dp[n][10][10][2][2];

int a[n];

ll dfs(int pos,int pre1,int pre2,bool lim,bool zero)

} if(pre1!=-1&&pre2!=-1) dp[pos][pre1][pre2][lim][zero]=ans;

return ans;

}ll part(char s)

ll solve()

} ll ans1=0,ans2=0;

for(int i=1;i<=lenl;i++)

ans1=(ans1*10+(l[i]-'0'))%mod;

for(int i=1;i<=lenr;i++)

ans2=(ans2*10+(r[i]-'0'))%mod;

ans2=(ans2-ans1+1+mod)%mod;

ans2=(ans2-ans+mod)%mod;

return ans2;

}int main()

洛谷 P3413 萌數

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

洛谷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 ...