小易擁有乙個擁有魔力的手環上面有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#includeusing
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 現在給出這個魔力手環的構...