題解 HNOI2008GT考試

2022-02-27 14:04:14 字數 1022 閱讀 2738

這題好難啊……完全不懂矩陣加速遞推的我tat

這道題目要求我們求出不含不吉利數字的字串總數,那麼我們有dp方程 : dp[i][j](長度為 i 的字串,最長與不吉利數字字首相同的字尾長度為 j 的方案數)。 dp[i][j] = σdp[i - 1][k] * a[k][j] (a 陣列表示從 k 狀態轉移到 j 狀態的方案數)。a 陣列我們可以通過 kmp 對不吉利數字的每乙個字首後面加上『0』~『9』轉移匹配得到(匹配成功表示成功轉移狀態,a[k][j]++;否則表示此時沒有重合的字尾,a[k][0]++)。

此時這道題目我們已經擁有了乙個相對優的解法了,但是還不夠。注意到上面的式子,我們對於dp陣列與a陣列分別建立矩陣,dp矩陣是乙個列矩陣,一列代表1~k的狀態,a矩陣第 j 行上每個數分別表示a[j][k]。所以得到的答案dp[i][j]即為dp矩陣與a矩陣第 j 行的乘積。矩陣快速冪優化即可。

#include using

namespace

std;

#define maxn 100000

intn, m, mod, k, ans;

char

s[maxn], nxt[maxn];

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *k;

}struct

matrix

matrix

operator*(const matrix &x)

return

tem;

}}t, s;

void

kmp()

j = 0

;

for(int i = 0; i < m; i ++)

for(int k = 0; k <= 9; k ++)

}void

qpow()

}int

main()

HNOI2008 GT考試 題解

這題比較難搞。考慮設計狀態 f 表示當前考慮到 x i 位,且 x 的後 j 位剛好與 a 列匹配時的方案數。最終答案為 sum f 接下來考慮如何轉移,如果我們以外層位置作為狀態,則必然是從 f 轉移到 f i 來,我們需要列舉最後一位進行轉移,但列舉最後一位對內層迴圈卻不太好控制,因為我們不太清...

補檔 HNOI 2008 GT考試

阿申準備報名參加gt考試,准考證號為n位數x1x2.xn 0 xi 9 他不希望准考證號上出現不吉利的數字。他的不吉利數學a1a2.am 0 ai 9 有m位,不出現是指x1x2.xn中沒有恰好一段等於a1a2.am.a1和x1可以為0 第一行輸入n,m,k.接下來一行輸入m位的數。n 10 9,m...

BZOJ1008 HNOI2008 越獄 題解

監獄有連續編號為1.n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 正難則反 反正我沒想到,定式思維想求發生越獄結果根本求不出來orz m n是總狀態數。不發生越獄時,第乙個人可以選m個宗教,往後所有...