題目**-luogu
我還沒怎麼見過直接說要用什麼演算法的題呢
矩陣乘法,矩陣快速冪什麼的不再多說,上oi-wiki
link
放幾道練習題(循序漸進):
按照慣例,推轉移矩陣。
三個式子前面的 pak
+1
pa_pa
k+1
這種都比較容易分解,因為式子已經在題目裡了,其餘的項難分解的基本如下兩種:
然後就可以推出來乙個維護 11
1111
個值的矩陣(空白處為 0
00 ):
a
ia_i
aib
ib_i
bic
ic_i
ciai+
1a_
ai+1bi+
1b_
bi+1ci+
1c_
ci+1iiii
2i^2
i21 11w
kw^k
wkz
kz^k
zka i+
1a_
ai+11
b i+
1b_
bi+11
c i+
1c_
ci+11
a i+
2a_
ai+2q
p11t
r1b i+
2b_
bi+2v
1u11
c i+
2c_
ci+2y
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...