這題比較難搞。考慮設計狀態:\(f_\) 表示當前考慮到 \(x_i\) 位,且 \(x\) 的後 \(j\) 位剛好與 \(a\) 列匹配時的方案數。最終答案為 \(\sum_^f_\)。
接下來考慮如何轉移,如果我們以外層位置作為狀態,則必然是從 \(f_\) 轉移到 \(f_i\) 來,我們需要列舉最後一位進行轉移,但列舉最後一位對內層迴圈卻不太好控制,因為我們不太清楚它的匹配長度到底是多少。所以轉化思路,另設 \(g_\) 表示在 \(x\) 的後 \(i\) 位與 \(a\) 列匹配的情況下,有多少種加數字的方法使得匹配長度變為 \(j\),這麼做可以使 \(g\) 只與 \(a\) 列有關,能夠預處理出來。
那麼轉移方程:
\[f_=\sum_^f_g_
\]由於 \(n\) 比較大,又發現這個式子長得很像矩陣乘法的式子,故可以快速冪遞推。即
\[f_i=[f_\ f_ \ \dots \ f_]=f_g,f_n=f_0g^n
\]**還是挺好寫的
#include using namespace std;
const int n=25;
int n,m,djq,nxt[n],g[n][n],f[n][n],res[n][n],ans;
char s[n];
void mul(int a[n][n],int b[n][n])
題解 HNOI2008GT考試
這題好難啊 完全不懂矩陣加速遞推的我tat 這道題目要求我們求出不含不吉利數字的字串總數,那麼我們有dp方程 dp i j 長度為 i 的字串,最長與不吉利數字字首相同的字尾長度為 j 的方案數 dp i j dp i 1 k a k j a 陣列表示從 k 狀態轉移到 j 狀態的方案數 a 陣列我...
補檔 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...
考試題題解
主講人igl albl 試題t2 t3 t1 t4 t5 暴力 dfs所有路徑,在使用clock的情況下預計 text 題意 給你一張有向圖,距離為 text 的正整數次冪的兩點間可以重新連一條長為 text 邊,求在此情況下的從起點到終點最短路。我們用 text 表示點 text 到點 text ...