DP 矩陣快速冪 kmp GT考試

2021-10-02 17:59:46 字數 2216 閱讀 4572

阿申準備報名參加 gt 考試,准考證號為 n 位數 x1x

2⋯xn

x_1x_2⋯x_n

x1​x2​

⋯xn​

,他不希望准考證號上出現不吉利的數字。

他的不吉利數字 a1a

2⋯am

a_1a_2⋯a_m

a1​a2​

⋯am​

有 m 位,不出現是指 x1x2⋯xn 中沒有恰好一段等於 a1a

2⋯am

a_1a_2⋯a_m

a1​a2​

⋯am​

,a

1a_1

a1​ 和 x

1x_1

x1​ 可以為 0。

輸入格式

第一行輸入 n,m,k。

接下來一行輸入 m 位的不吉利數字。

輸出格式

阿申想知道不出現不吉利數字的號碼有多少種,輸出模 k 取餘的結果。

資料範圍

0 ≤x

i,ai

≤9

0≤x_i,a_i≤9

0≤xi​,

ai​≤

9,1 ≤n

≤109

1≤n≤109

1≤n≤10

9,1 ≤m

≤20

1≤m≤20

1≤m≤20,2≤

k≤

1000

2≤k≤1000

2≤k≤10

00輸入樣例:

4 3 100

111輸出樣例:

81首先我們只要匹配的時候沒有匹配到第m位都是匹配失敗的,那麼這些情況都是滿足我們題意得。這些情況我們可以通過kmp的next指標做到記錄答案的。

我們定義f(i

,j

)f(i,j)

f(i,j)

進行到第i個位置,並且匹配到模式串的第j個位置。

a (i

,j

)a(i,j)

a(i,j)

表示已經匹配到第i個位置了,再匹配到第j個位置的方法數目。

f (i

,j)=

∑k=1

m−1f

(i,k

)∗a(

k,j)

f(i,j)=\sum_^f(i,k)*a(k,j)

f(i,j)

=∑k=

1m−1

​f(i

,k)∗

a(k,

j)

#include

typedef

long

long ll;

using

namespace std;

int mod;

struct mat

void

mate()

inline mat operator+(

const mat &t)

const

inline mat operator-(

const mat &t)

const

inline mat operator*(

const mat &t)

const

return res;

}inline mat pow

(ll x)

for(

int i =

0; i < n; i++

)for

(int j =

0; j < n; j++

) a[i]

[j]= res.a[i]

[j];

return res;

}}f,a,res;

int ne[

1005];

char str[

1005];

intmain()

for(

int j =

0; j < m; j ++

)for

(int c =

'0'; c <=

'9'; c ++

) a.

pow(n)

; f=f*a;

int res=0;

for(

int i=

0;i) res=

(res+f.a[0]

[i])

%mod;

cout<}

bzoj1009 GT考試 dp 矩陣快速冪

題意 構造乙個字串 數字0 9 不含乙個子串的個數 我這麼蒟蒻腫麼可能想到是dp嘛 定義f i j 表示當前構造了i位,與模式串p匹配了前j位的方案數 然後列舉下一位填什麼,然後乘上當前構造出來的和模式串匹配到k的方案數。即是f i 1 k f i j a j k 因為從j轉移到k,可以用的數字不一...

BZOJ 1009 GT考試(dp 矩陣快速冪)

description 阿申準備報名參加gt g t考試,准考證號為 n n 位數x1 x2.xn 0 x i 9 role presentation style position relative x1x 2.xn 0 x i 9 x1x2.xn 0 x i 9 他不希望准考證號上出現不吉利的數字...

dp 矩陣乘法快速冪

1 p1926 斐波那契 include include include using namespace std long long n const int mod 1000000007 long long nw 2 2 ans 2 2 long long t 2 2 void mul1 void ...