13 P1707 刷題比賽

2021-10-10 18:57:13 字數 2325 閱讀 9501

題目**-luogu

我還沒怎麼見過直接說要用什麼演算法的題呢

矩陣乘法,矩陣快速冪什麼的不再多說,上oi-wiki

link

放幾道練習題(循序漸進):

按照慣例,推轉移矩陣。

三個式子前面的 pak

+1

pa_pa

k+1​

這種都比較容易分解,因為式子已經在題目裡了,其餘的項難分解的基本如下兩種:

然後就可以推出來乙個維護 11

1111

個值的矩陣(空白處為 0

00 ):

a

ia_i

ai​b

ib_i

bi​c

ic_i

ci​ai+

1a_

ai+1​bi+

1b_

bi+1​ci+

1c_

ci+1​iiii

2i^2

i21 11w

kw^k

wkz

kz^k

zka i+

1a_

ai+1​1

b i+

1b_

bi+1​1

c i+

1c_

ci+1​1

a i+

2a_

ai+2​q

p11t

r1b i+

2b_

bi+2​v

1u11

c i+

2c_

ci+2​y

11x1

21i +1

i+1i+

111i+1

2^2

i+1221111

11w i+

1w^

wi+1wzi+

1z^

zi+1

z然後將 lot 矩陣設為以上矩陣:

lot.m[0][3]=lot.m[1][4]=lot.m[2][5]=lot.m[3][4]=lot.m[3][5]=lot.m[3][8]=lot.m[4][3]=lot.m[4][5]=lot.m[4][9]=lot.m[5][3]=lot.m[5][4]=lot.m[5][6]=lot.m[5][10]=lot.m[6][6]=lot.m[6][8]=lot.m[7][7]=lot.m[7][8]=lot.m[8][8]=1;//所有為1的格

lot.m[5][8]=lot.m[7][6]=2;//所有為2的格

lot.m[3][0]=q;lot.m[3][3]=p;lot.m[3][6]=t;lot.m[3][7]=r;//與求a數列相關的格

lot.m[4][1]=v;lot.m[4][4]=u;lot.m[9][9]=w;//與求b數列相關的格

lot.m[5][2]=y;lot.m[5][5]=x;lot.m[10][10]=z;//與求c數列相關的格

之後是普通的矩陣快速冪,注意進行矩陣乘法需要使用龜速乘防爆

龜速乘

int mut_q(int a,int b)

a=(a*2)%pp;

b/=2;

} return ans;

}node do_mut(node a,node b)

} }return ans;

}void done(int x)

lot=do_mut(lot,lot);

x>>=1;

}}

最後乙個問題:如何求答案

其實這個明明很明顯的嘛,不多說了

第四行,第五行,第六行分別對應nodgd,ciocio,nicole,把這三行分別乘上基礎數列(如下),再膜一下,就是每個人的答案了

1 ,1

,1,3

,3,3

,1,1

,1,w

,z

1 ,1,1,3,3,3,1,1,1,w,z

1,1,1,

3,3,

3,1,

1,1,

w,z(對應上文**的11項)

本部分**:

int suma=0,sumb=0,sumc=0;

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

cout<<"nodgd "

P1707 刷題比賽

題目提供者nodgd 標籤倍增遞推矩陣洛谷原創 難度提高 省選 提交該題 討論 題解記錄 nodgd是乙個喜歡寫程式的同學,前不久洛谷oj橫空出世,nodgd同學當然第一時間來到洛谷oj刷題。於是發生了一系列有趣的事情,他就打算用這些事情來出題噁心大家 洛谷oj當然算是好地方,nodgd同學打算和朋...

leetcode刷題 棒球比賽

你現在是棒球比賽記錄員。給定乙個字串列表,每個字串可以是以下四種型別之一 1.整數 一輪的得分 直接表示您在本輪中獲得的積分數。2.一輪的得分 表示本輪獲得的得分是前兩輪有效 回合得分的總和。3.d 一輪的得分 表示本輪獲得的得分是前一輪有效 回合得分的兩倍。4.c 乙個操作,這不是乙個回合的分數 ...

leetcode刷題筆記 13

給定乙個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 的範圍內。自己想不到,參考解決方法,首先看到的是將所有字元與數值對映,包括單個和雙字母的組合,然後進行迴圈查詢,先查詢兩個字母,如果存在對應關係則加上值,然後i 若不存在,則查詢乙個。需要注意的是,查詢條件是i所有都對映 func ro...