魔力手環(快速冪求解)

2022-07-10 05:36:10 字數 1477 閱讀 4465

小易擁有乙個擁有魔力的手環上面有n個數字(構成乙個環),當這個魔力手環每次使用魔力的時候就會發生一種奇特的變化:每個數字會變成自己跟後面乙個數字的和(最後乙個數字的後面乙個數字是第乙個),一旦某個位置的數字大於等於100就馬上對100取模(比如某個位置變為103,就會自動變為3).現在給出這個魔力手環的構成,請你計算出使用k次魔力之後魔力手環的狀態。

輸入描述:

輸入資料報括兩行:

第一行為兩個整數n(2 ≤ n ≤ 50)和k(1 ≤ k ≤ 2000000000),以空格分隔

第二行為魔力手環初始的n個數,以空格分隔。範圍都在0至99.

輸出描述:

輸出魔力手環使用k次之後的狀態,以空格分隔,行末無空格。
輸入例子:
3 2

1 2 3

輸出例子:
8 9 7
思路:n個數的環進行移動相加,考慮到矩陣行、列變換可以完成這種移動和相加,於是構造出快速冪矩陣,快速冪矩陣m和原矩陣s相乘得到一次移動的結果,那麼f(n+1) = m^n*s(這裡的冪和乘法是矩陣的運算),很容易得到如下遞推示例:

[[1 1 0] [0 1 1] [1 0 1]]*[[a][b][c]] = [[a+b][b+c][c+a]], 如此,已經確定了快速冪矩陣m,那麼就要考慮如何相乘得到最快的冪求解速度。建議參看這篇部落格

**如下:(演算法複雜度為o(n^3*log(k)))

#include#include

using

namespace

std;

intmain()

//構造快速冪矩陣

intmul[n][n];

for(int i=0;i1;++i)

fill(mul[n-1],mul[n-1]+n,0

); mul[n-1][0] = 1

; mul[n-1][n-1] = 1

;

//轉化為2進製,進行二分搜尋

while

(k)

}memcpy(d, temp,

sizeof

(d));

}k = k>>1

;

inttemp[n][n];

for(int i=0;ii)

for(int i=0;ii)

temp[i][j] %= 100;//

快速冪取余中,a^k % c = (a % c)^k % c

} }

for(int i=0;ii)

}//輸出結果

for(int i=0;i1;++i)

cout

<< d[n-1]

}

矩陣快速冪的總結(更多問題->熟練掌握)

快速冪問題求解

快速冪問題在一開始的acm題還是很常見的。其中有乙個很重要的數學公式 a b c a c b c c。從這個公式中也可以推出 a a c a c a c c 所以,對於求解a b mod c這樣的問題,可以用這個公式來解決。最重要的容易錯的一點就是記得要用long long型,防止溢位。對於求解a ...

網易2017春招筆試 魔力手環

輸入描述 輸入資料報括兩行 第一行為兩個整數n 2 n 50 和k 1 k 2000000000 以空格分隔 第二行為魔力手環初始的n個數,以空格分隔。範圍都在0至99.輸出描述 輸出魔力手環使用k次之後的狀態,以空格分隔,行末無空格。輸入例子 3 2 1 2 3 輸出例子 8 9 7 coding...

魔力手環 網易2017春招筆試題

小易擁有乙個擁有魔力的手環上面有n個數字 構成乙個環 當這個魔力手環每次使用魔力的時候就會發生一種奇特的變化 每個數字會變成自己跟後面乙個數字的和 最後乙個數字的後面乙個數字是第乙個 一旦某個位置的數字大於等於100就馬上對100取模 比如某個位置變為103,就會自動變為3 現在給出這個魔力手環的構...