矩陣真是個神奇的東西。。
只要搞出乙個矩陣乘法,那麼遞推式可以完美的用上快速冪,然後使複雜度降到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, gxn+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...