這題好難啊……完全不懂矩陣加速遞推的我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 usingnamespace
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個宗教,往後所有...