Codevs 1281 Xn數列 題解

2021-07-24 02:51:34 字數 1657 閱讀 8571

其實這題看一下資料範圍就知道用o(n)的是絕對不行的,於是咱們換到log級的

再一看,運算形式還是快速取模的運算,那麼就一定會在快速冪、矩陣快速冪、快速乘法中選擇

顯然,這題並沒有涉及到快速冪

再一看,括號裡有加法,於是很快的我們就可以確定這是矩陣快速冪

再一看資料範圍,int64(long long)

推出矩陣後,我們會發現雖然我們都模m但是m的資料範圍是不是也很大

那麼我們考慮在做矩陣乘法的時候,乘法是不是也可能超出int64(long long)的範圍,顯然是有可能的

於是我們在做矩陣乘法的時候要用快速乘法協助一下

注意在運算的時候我們都是模m但是輸出的結果還要模g

於是這題就a了

var

m,a,n,g :int64;

f1,f2 :array[0..2,0..2] of int64;

b,c :array[0..2] of int64;

function qp(a,b:int64):int64; //快速乘法

var ans:int64;

begin

ans:=0;

while (b<>0) do

begin

if (b and 1=1) then ans:=(ans+a) mod m;

b:=b >>1;

a:=(a+a) mod m;

end;

exit(ans);

end;

procedure mul1;

var j,k:longint;

begin

fillchar(c,sizeof(c),0);

for j:=1 to 2 do

for k:=1 to 2 do

c[j]:=(c[j]+qp(b[k] mod m,f1[k,j] mod m) mod m) mod m;

b:=c;

end;

procedure mul2;

var i,j,k:longint;

begin

fillchar(f2,sizeof(f2),0);

for i:=1 to 2 do

for j:=1 to 2 do

for k:=1 to 2 do f2[i,j]:=(f2[i,j]+qp(f1[i,k] mod m,f1[k,j] mod m) mod m) mod m;

f1:=f2;

end;

begin

read(m,a,b[2],b[1],n,g);

f1[1,1]:=a;f1[1,2]:=0;f1[2,1]:=1;f1[2,2]:=1;

while (n>0) do //矩陣快速冪

codevs1281 Xn數列,矩陣乘法練習

時間限制 1 s 空間限制 128000 kb 題目等級 大師 master 題解 題目描述 description 給你6個數,m,a,c,x0,n,g xn 1 axn c mod m,求xn m,a,c,x0,n,g 10 18 輸入描述 input description 一行六個數 m,a...

wikioi 1281 Xn數列(矩陣乘法)

矩陣真是個神奇的東西。只要搞出乙個矩陣乘法,那麼遞推式可以完美的用上快速冪,然後使複雜度降到log 真是神奇。在本題中,應該很快能得到下邊的矩陣 a,0 xn,c xn 1,c 1,1 那麼我要要乘n次,也就是說要乘n個 a,0 1,1 因為是個方陣,所以可以用快速冪 我們先用快速冪算出n個這個2 ...

code vs 方格取數3

時間限制 2 s 空間限制 256000 kb 題目等級 大師 master 題解 檢視執行結果 問題描述 在乙個有m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任 意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。程式設計任務 對於給定的方格...