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

2021-08-17 14:45:29 字數 2752 閱讀 2213

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)

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

a2...am

(0≤a

i≤9)

a 1a

2...am

(0≤a

i≤9)

有m m

位,不出現是指x1

x2...xn

' role="presentation" style="position: relative;">x1x

2...xn

x1x2...xn

中沒有恰好一段等於a1

a2...am

a 1a

2...am

.a1a

1和x1

x

1可以為

0 0

input

第一行輸入n,

m,k' role="presentation" style="position: relative;">n,m

,kn,

m,k.接下來一行輸入

m m

位的數(n

≤109,

m≤20,

k≤1000

)' role="presentation" style="position: relative;">(n≤

109,m

≤20,k

≤1000)(

n≤109

,m≤20

,k≤1000)

output

阿申想知道不出現不吉利數字的號碼有多少種,輸出模

k k

取餘的結果.

sample input

4 3 100

sample output

solution以d

p[i]

[j]' role="presentation" style="position: relative;">dp[

i][j

]dp[

i][j

]表示前

i i

個字母已經確定,沒有出現過不吉利數字,且末尾與不吉利數字最多匹配了

j' role="presentation" style="position: relative;">j

j位的方案數,則答案即為∑j

=0m−

1dp[

n][j

] ∑j=

0m−1

dp[n

][j]

,由於已經匹配了

j j

位,假設要在後面加上乙個數字k(

0≤k≤

9)' role="presentation" style="position: relative;">k(0

≤k≤9

)k(0

≤k≤9

),暴力求出此時這j+

1 j+1

個數字與不吉利數字的最長匹配

t t

,只要t≠

m' role="presentation" style="position: relative;">t≠m

t≠m,那麼dp

[i][

j]d p[

i][j

]狀態即可轉移為dp

[i+1

][t]

d p[

i+1]

[t

],以此求出dp

[i] dp[

i]

到dp[i+1

] dp[

i+1]

的轉移矩陣,矩陣快速冪加速轉移即可

code

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

typedef

int m[22][22];

int n,m,mod;

char s[22];

void mul(m &a,m b)

for(int i=0;ifor(int j=0;jint main()

if(flag)break;

}if(i!=m)a[i][j]++;

}pow(a,n);

int ans=0;

for(int i=0;i0])%mod;

printf("%d\n",ans);

return

0;}

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考試 KMP 矩陣快速冪

題意 b為非法數字b 1 b m 其位數 20.某個數有n位,每位可以填入 0,9 n 1e9 問有多少種填數字方案,滿足n位中沒有非法數字m出現?先不考慮n範圍 則可以設定dp i j 表示放了合法放了前i位,其字尾j和非法的前j位相同的方法數.轉移狀態顯然是一位一位新增 顯然dp i 1 j 1...

bzoj1009矩陣快速面 kmp

其實kmp真的很次要,求長度為20的kmp感覺真的有點殺雞用牛刀 這題思路相當明確 一看題就是數字dp,一看n的大小就是矩陣 矩陣的構造用m m比較方便,本來想寫1 m的矩陣乘m m的,但是感覺想起來太麻煩就偷懶,沒想到1a了 log的速度的確可以,87ms賊快,好久沒見這麼短的執行時間了 1 in...