wikioi 1281 Xn數列(矩陣乘法)

2021-09-08 17:19:14 字數 1750 閱讀 6218

矩陣真是個神奇的東西。。

只要搞出乙個矩陣乘法,那麼遞推式可以完美的用上快速冪,然後使複雜度降到log

真是神奇。

在本題中,應該很快能得到下邊的矩陣:

┏ a, 0 ┓

[xn, c] × ┃        ┃ = [xn+1, c]

┗ 1, 1 ┛

那麼我要要乘n次,也就是說要乘n個

┏ a, 0 ┓

┃        ┃

┗ 1, 1 ┛

因為是個方陣,所以可以用快速冪

我們先用快速冪算出n個這個2×2的矩陣,然後再乘上[x0, c]

#include #include #include #include #include #include using namespace std;

#define rep(i, n) for(int i=0; i<(n); ++i)

#define for1(i,a,n) for(int i=(a);i<=(n);++i)

#define for2(i,a,n) for(int i=(a);i<(n);++i)

#define for3(i,a,n) for(int i=(a);i>=(n);--i)

#define for4(i,a,n) for(int i=(a);i>(n);--i)

#define cc(i,a) memset(i,a,sizeof(i))

#define read(a) a=getint()

#define print(a) printf("%d", a)

#define dbg(x) cout << #x << " = " << x << endl

#define printarr(a, n, m) rep(aaa, n)

inline const int getint()

inline const int max(const int &a, const int &b)

inline const int min(const int &a, const int &b)

return ret;

}inline void matrixmul(matrix a, matrix b, matrix c, const int &la, const int &lb, const int &lc, const ll &mod)

rep(i, la) rep(j, lc)

c[i][j]=t[i][j];

}int main()

matrixmul(f, tb, f, 1, 2, 2, m);

cout << f[0][0]%g;

return 0;

}

給你6個數,m, a, c, x0, n, g

xn+1 = ( axn + c ) mod m,求xn

m, a, c, x0, n, g<=10^18

一行六個數 m, a, c, x0, n, g

輸出乙個數 xn mod g

11 8 7 1 5 3

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

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

Codevs 1281 Xn數列 題解

其實這題看一下資料範圍就知道用o n 的是絕對不行的,於是咱們換到log級的 再一看,運算形式還是快速取模的運算,那麼就一定會在快速冪 矩陣快速冪 快速乘法中選擇 顯然,這題並沒有涉及到快速冪 再一看,括號裡有加法,於是很快的我們就可以確定這是矩陣快速冪 再一看資料範圍,int64 long lon...

Xn數列 矩陣乘法 慢速乘法

題目描述 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...