Warcraft III 守望者的煩惱

2021-10-10 12:35:47 字數 1333 閱讀 9329

頭腦並不發達的warden最近在思考乙個問題,她的閃爍技能是可以公升級的,k級的閃爍技能最多可以向前移動k個監獄,一共有n個監獄要視察,她從入口進去,一路上有n個監獄,而且不會往回走,當然她並不用每個監獄都視察,但是她最後一定要到第n個監獄裡去,因為監獄的出口在那裡,但是她並不一定要到第1個監獄。

守望者warden現在想知道,她在擁有k級閃爍技能時視察n個監獄一共有多少種方案?

第一行是閃爍技能的等級 k (1≤k≤10)

第二行是監獄的個數 n (1≤n≤2^31−1) 

由於方案個數會很多,所以輸出它 mod 7777777後的結果就行了

2

4

5
把監獄編號1 2 3 4,閃爍技能為2級,

一共有5種方案

→1→2→3→4

→2→3→4

→2→4

→1→3→4

→1→2→4

解析:動態規劃+矩陣快速冪

假設 dp[i] 表示達到監獄 i 時所有的方案數,則有 dp[i] = dp[i-1]+dp[i-2]+...+dp[i-k](i>=k),當n的大小很大時,逐個計算肯定不行。此處借助矩陣快速冪乘法求解線性遞推關係。如何將加法轉換成乘法呢?假設 k = 5,a' = b * a , 則 dp[1]-->dp[n] 需要 a' = b^n * a 

第一步:構造矩陣b

for(int i=1;i第二步:矩陣乘法

map matrix(map x,map y)

return c;

}

第三步:矩陣快速冪

while(n)
完整**:

#include#include#include#include#include#define ll long long

#define mod 7777777

using namespace std;

struct mapa,b;

int n,k;

map matrix(map x,map y)

return c;

}int main()

printf("%lld",a.s[k][k]);

}

守望者的逃離

前言 送你破鍵盤,廉價發打字聲依稀。送你破電腦,便宜的讓你去做題。一本藍皮書一直沒落任能回味,那套高質量題 歡迎來到嘟嘟課堂。今天,嘟嘟老師要講一道看起來很難,實際卻很簡單的題 守望者的逃離。題目描述 惡魔獵手尤迫安野心勃勃.他背叛了暗夜精靈,率深藏在海底的那加企圖叛變 守望者在與尤迪安的交鋒中遭遇...

守望者的逃離

功能 判斷守望者是否能夠逃出荒島 輸入引數 unsigned int uimagic 無符號整型,守望者的初始魔法值 unsigned int uidistance 無符號整型,守望者所在的初始位置與島出口之間的距離。unsigned int uisec 無符號整型,島沉沒需要的時間,單位為秒 輸出...

守望者的逃離

惡魔獵手尤迪安野心勃勃,他背叛了暗夜精靈,率領深藏在海底的娜迦族企圖叛變。守望者在與尤迪安的交鋒中遭遇了圍殺,被困在乙個荒蕪的大島上。為了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沉下去。到那時,島上的所有人都會遇難。守望者的跑步速度為17m s,以這樣的速度是無法逃離荒島的。慶幸的是守望...