補檔 HNOI 2008 GT考試

2022-03-27 11:21:56 字數 2433 閱讀 9361

阿申準備報名參加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<=20,k<=1000

阿申想知道不出現不吉利數字的號碼有多少種,輸出模k取餘的結果.

4 3 100

111

這道題一開始真心沒有什麼思路,後來我跟兩個dalao一起商(luan)談(gao)了乙個來小時,終於搞了出來= =

首先,我們我們考慮兩個串(從短到長)

第乙個串為不斷增加的准考證號,第二個串為不吉利的號碼,第乙個串的字尾與第二個串的字首為重複部分,那麼我們很容易得出遞推關係

先扯出來,考慮兩個集合,乙個集合為不吉利的號碼,乙個集合為吉利的號碼。我們只考慮字尾(正確性顯然,因為長度長的串一定是由長度短的串遞推過來的,所以如果前面有不吉利串,一定被前面的串卡掉了),當字尾包含了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構造初始矩陣,矩陣快速冪得到遞推結果。

為什麼是矩陣快速冪?

這個問題很簡單。我們知道,矩陣乘是這樣寫的:

1

martrix tmp;

2for(int i=0;i)

3for(int j=0;j)9}

10return tmp;

view code

那麼問題就簡單起來了,考慮乙個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 #include4

using

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 }

view code

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教授要求在乙個一...