阿申準備報名參加 gt 考試,准考證號為 n 位數 x1x
2⋯xn
x_1x_2⋯x_n
x1x2
⋯xn
,他不希望准考證號上出現不吉利的數字。
他的不吉利數字 a1a
2⋯am
a_1a_2⋯a_m
a1a2
⋯am
有 m 位,不出現是指 x1x2⋯xn 中沒有恰好一段等於 a1a
2⋯am
a_1a_2⋯a_m
a1a2
⋯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 ...