Xn數列 矩陣乘法 慢速乘法

2021-07-24 02:31:34 字數 1754 閱讀 9584

題目描述 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, c, x0, n, g

輸出描述 output description

輸出乙個數 xn mod g

樣例輸入 sample input

11 8 7 1 5 3

樣例輸出 sample output

2資料範圍及提示 data size & hint

int64按位相乘可以不要用高精度。

本來一開始覺得題挺簡單,轉移矩陣 a 1 xn 或者是 a c xn

0 1 c 0 1 1

結果兩個點wa了,原因資料範圍。

從大神們的blog 學到了乙個叫慢速懲罰的東西,其原理和快速冪差不多,然後再利用乘法的分配率

code

#include

using namespace std;

long long zy[3][3];

long long fz[3][3];

long long m, a, c, x0, n, g;

long long mscf(long long x,long long y)

return ans;

}int zyy(long long s1[3][3],long long s2[3][3])

; for (int i=1;i<=2;++i)

for (int

j=1;j<=2;++j)

for (int

k=1;k<=2;++k)

tmp[i][j]=(tmp[i][j]+(mscf(s1[i][k],s2[k][j])))%m;

for (int

i=1;i<=2;++i)

for (int

j=1;j<=2;++j)

s1[i][j]=tmp[i][j];

}int

ksm(long

longx)}

int main()

#include

using namespace std;

long long zy[3][3];

long long fz[3][3];

long long m, a, c, x0, n, g;

long long mscf(long long x,long long y)

return ans;

}int zyy(long long s1[3][3],long long s2[3][3])

; for (int i=1;i<=2;++i)

for (int

j=1;j<=2;++j)

for (int

k=1;k<=2;++k)

tmp[i][j]=(tmp[i][j]+(mscf(s1[i][k],s2[k][j])))%m;

for (int

i=1;i<=2;++i)

for (int

j=1;j<=2;++j)

s1[i][j]=tmp[i][j];

}int

ksm(long

longx)}

int main()

wikioi 1281 Xn數列(矩陣乘法)

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

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...

慢速乘法和快速冪

兩者都用了二進位制的性質,慢速乘法避免了乘法爆long long 快速冪加速乘方運算 ll fast pow ll a,ll k,ll mo while k 乙個數的n次冪等於n的二進位制次冪的乘積 such as k 7 k 1 k 2 k 4 所以快速冪就是通過乘法處理出k的2進製c次冪 以加速...