HNOI2002 公交車路線(矩陣快速冪)題解

2022-05-15 07:46:29 字數 1490 閱讀 4256

題目描述:

在長沙城新建的環城公路上一共有8個公交站,分別為a、b、c、d、e、f、g、h。公共汽車只能夠在相鄰的兩個公交站之間執行,因此你從某乙個公交站到另外乙個公交站往往要換幾次車,例如從公交站a到公交站d,你就至少需要換3次車。

tiger的方向感極其糟糕,我們知道從公交站a到公交e只需要換4次車就可以到達,可是tiger卻總共換了n次車,注意tiger一旦到達公交站e,他不會愚蠢到再去換車。現在希望你計算一下tiger有多少種可能的乘車方案。

輸入格式:

輸入檔案由bus.in讀入,輸入檔案當中僅有乙個正整數n(4<=n<=10000000),表示tiger從公交車站a到公交車站e共換了n次車。

輸出格式:

輸出到檔案bus.out。輸出檔案僅有乙個正整數,由於方案數很大,請輸出方案數除以 1000後的餘數。

輸入樣例#1:

6
輸出樣例#1:

8

解題思路:

一開始我沒感覺跟矩陣有什麼聯絡,

以前做的都是不需要轉換一下的裸題,

後來發現其實有點floyd的思想。

做矩陣乘法的時候:

w[i][j]=(w[i][j]+(q[i][k]*e[k][j])%mod)%mod)),

可以理解為從i走到j的方案數,

每次列舉1-n為中間點,

用乘法原理去更新w[i][j]的方案數,

這樣一看就跟矩陣快速冪有聯絡了。

還有乙個細節問題,就是不能從i 走到 5 再走到 j,

因為他走到5就不會離開了。

所以**如下:

#include#include

#include

#define ll long long int

using

namespace

std;

struct

mata,b;

ll n,mod=1000

;mat mul(mat q,mat e)

void

pow(mat c,ll p)

p>>=1

; c=mul(c,c);

} }int

main()

a.t[

8][9]=0;a.t[9][8]=0

; a.t[

1][8]=1;a.t[8][1]=1

; pow(a,n);

printf(

"%lld

",b.t[1][5]%mod);

}

洛谷 2233 HNOI2002 公交車路線

題目戳這裡 一句話題意 乙個大小為8的環,求從1到5正好n步的方案數 途中不能經過5 solution 鉅說這個題目很水 應該是比較容易的dp,直接從把左邊和右邊的方案數加起來即可,但是有幾個需要注意的地方 1.因為n有1e7所以需要滾動陣列。2.因為不能經過5,所以4只能從3轉移,6只能從7轉移。...

洛谷 P2233 HNOI 公交車線路

洛谷 不知道大家做沒做過傳球遊戲,這一題和傳球遊戲的轉移方程幾乎一樣。令 a 為 1 點,e 為 5 點,那麼 f i j 代表第i步走到j的方案數。f i j f i 1 j 1 f i 1 j 1 因為題中給的是乙個環,所以有幾種情況。if j 8 f i j f i 1 1 f i 1 7 i...

公交車路線查詢系統後台資料庫設計 查詢演算法

1.公交車路線資訊在資料庫中的儲存方式 顯然,如果在資料庫中簡單的使用表bus route 路線名 路線經過的站點,費用 來儲存公交車路線的線路資訊,則很難使用查詢語句實現乘車線路查詢,因此,應該對線路的資訊進行處理後再儲存到資料庫中,筆者使用的方法是用站點 路線關係表stop route 站點 路...