阿申準備報名參加gt考試,准考證號為n位數x1x2....xn(0<=xi<=9),他不希望准考證號上出現不吉利的數字。這道題一開始真心沒有什麼思路,後來我跟兩個dalao一起商(luan)談(gao)了乙個來小時,終於搞了出來= =他的不吉利數學a1a2...am(0<=ai<=9)有m位,不出現是指x1x2...xn中沒有恰好一段等於a1a2...am. a1和x1可以為0
第一行輸入n,m,k.接下來一行輸入m位的數。 n<=10^9,m<=20,k<=1000
阿申想知道不出現不吉利數字的號碼有多少種,輸出模k取餘的結果.
4 3 100
111
首先,我們我們考慮兩個串(從短到長)
第乙個串為不斷增加的准考證號,第二個串為不吉利的號碼,第乙個串的字尾與第二個串的字首為重複部分,那麼我們很容易得出遞推關係
先扯出來,考慮兩個集合,乙個集合為不吉利的號碼,乙個集合為吉利的號碼。我們只考慮字尾(正確性顯然,因為長度長的串一定是由長度短的串遞推過來的,所以如果前面有不吉利串,一定被前面的串卡掉了),當字尾包含了m個不吉利串,該串一定是不吉利的。那麼,字尾包含0~m-1個不吉利串的字首的串一定是吉利的。所以,我們把求不吉利的串 轉化為 求 字尾包含不吉利串0~m-1 的 串 的 方案數
然而與字串有啥關係?
考慮這樣乙個不吉利串
當你的字尾帶了2時,你怎麼知道你的後幾位是12還是12312?所以,加一位不吉利數不代表直接在後面加了一位。
那麼,問題來了,如何表示這些奇(chun)奇(de)怪(bu)怪(xing)的轉移?
考慮乙個遞推矩陣,設dp[i][j]為第i個號碼匹(zhuan)配(yi)到第j個不吉利數字的方案數,設a[k][i]為k位後加乙個數轉移到j的方案數,我們可以輕易的得出遞推關係:
用kmp構造初始矩陣,矩陣快速冪得到遞推結果。
為什麼是矩陣快速冪?
這個問題很簡單。我們知道,矩陣乘是這樣寫的:
1view codemartrix tmp;
2for(int i=0;i)
3for(int j=0;j)9}
10return tmp;
那麼問題就簡單起來了,考慮乙個3*3的初始矩陣,第i行,第j列表示從第i位加乙個數字轉移到第j為數字的方案數,那麼以該矩陣的平方的第一行第一列的數為例,(設初始矩陣為a,該矩陣為x):
x[1][1]=a[1][1]×a[1][1]+a[1][2]×a[2][1]+a[1][3]×a[3][1];
因為是平方得到的矩陣,所以代表了轉移兩步的狀態,我們知道,x[1][1]代表了從第一位經兩步轉移到第一位的方案數,由加法原理可知:
1->1(經兩步)=(1->1->1)+(1->2->1)+(1->3->1)
而又由乘法原理可知:
1->2->1=(1->2)×(2->1)
那麼正確性就很顯然了,由矩陣快速冪的遞推關係可知,最終結果即為第一行的數的和
至於kmp,把10個數字扔進去亂搞就是了= =
記得要模k= =
1 #include2 #include3 #include4view codeusing
namespace
std;
5int
n,m,mod;
6char s[25];7
int kp[25
];8 inline void
get_kp()19}
20struct
node
25 node operator*(node &a)34}
35return
tmp;36}
37 node operator*=(node &a)
41}a,sing;
42 ostream& operator
<
48return
out;49}
50int
main()
64 }//
cout<65
/*for(int i=0;i66
for(int j=0;j67
cout<68
cout<
*/70
for(int i=0;i)
71 sing.data[i][i]=1;72
inttmp(n);
73while
(tmp)
81int ans(0
);82
for(int i=0;i)
86 cout<
87//
while(1);
88 }
ps:2017-6-14 晚 講題用題解
pss:調矩陣快調死了= =,最後發現初始矩陣求錯了= =
HNOI2008 玩具裝箱
p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓 縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1.n的n件玩具,第i件玩具經過 壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時如果乙...
HNOI 2008 玩具裝箱
p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為 1.n 的 n 件玩具,第i件玩具經過壓縮後變成一維長度為 ci 為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時...
HNOI2008 玩具裝箱toy
重點在講斜率優化 description p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1.n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一...