題意:對於乙個n行m列的矩陣,第i行第j列的元素為f[i][j]。已知a, b, c, d,並且矩陣元素滿足:
f[1][1] = 1
f[i,j] = a * f[i][j-1] + b (j!=1)
f[i,1] = c * f[i-1][m] + d (i!=1)
求f[n][m] 答案對1e9 + 7取模
1 <= n, m <= 1e1000000
1 <= a, b, c, d <= 1e9
這道題一眼看上去非常的矩陣快速冪
好像沒毛病?
看了眼資料量 哭遼
沒關係 我可以10000進製快速冪!(看起來很穩
那就寫一寫?
// luogu-judger-enable-o2
#include
#include
#include
#include
#include
#include
#pragma gcc optimize("ofast,no-stack-protector")
using
namespace std;
const
int n =
(int
)1e6+5
;const
int m =
1e3;
const
long
long p =
1e9+7;
inline
long
long
mod(
long
long x)
struct matrix
}next1, next2, stot, tot;
inline matrix operator*(
const matrix& x,
const matrix& y)
char n[n]
, m[n]
, tn[n]
, tm[n]
;long
long a, b, c, d;
inline
void
init()
inline matrix qqp
(matrix x,
int y)
return res;
}inline matrix qpow
(matrix x,
int len,
char
* y)
return res;
}inline
void
debug
(matrix x)
intmain
(int argc,
char
*argv)
for(
int i = lm -
1; i >=0;
--i)
if(m[i]
=='0'
) m[i]
='9'
;else
int it;
for(it =
0; it < ln && n[it]
=='0'
;++it)
; ltn = ln - it;
for(
; it < ln;
++it) tn[ln - it -1]
= n[it]
; tn[ltn]
= tn[ltn +1]
= tn[ltn +2]
='0'
; tn[ltn +3]
='\0'
;for
(it =
0; it < lm && m[it]
=='0'
;++it)
; ltm = lm - it;
for(
; it < lm;
++it) tm[lm - it -1]
= m[it]
; tm[ltm]
= tm[ltm +1]
= tm[ltm +2]
='0'
; tm[ltm +3]
='\0'
; stot =
qpow
(next1, ltm, tm)
; tot = next2 * stot;
tot = stot *
qpow
(tot, ltn, tn)
;printf
("%lld\n"
,mod
(tot.mat[0]
[0]+ tot.mat[0]
[1])
);return0;
}
NOI2013 矩陣遊戲
據學長的話來說 這是當年noi最簡單的一道題 於是抱著試一試的心態做了一做 蒟蒻qaq 由於矩陣乘法不會,只能數學必修的種數列知識推公式 先橫向推 f x k a f x 1 k 展開就可以得到乙個等比數列 然後根據等比數列的性質可得 fx ax 1 f1 b ax 1 1 a 1 至此我們完成了將...
NOI2013矩陣遊戲
題目鏈結luogu1397矩陣遊戲 題目大意 已知 f1 1 1 fi,j a f i,j 1 bf i,1 c fi 1,m d j 1 i 1 求f n,m 我們可以構造矩陣 1 fn,1 1 0ba m 1 1fn m 1 c fn 1,m d 10b a m 1 1 fn,m 令t 10ba...
矩陣乘法 NOI2013 向量內積
兩個 d 維向量 a a1,a2,ad 與 b b1,b 2,bd 的內積為其相對應維度的權值的乘積和,即 a b i 1 daib i a1 b1 a 2b2 ad bd現在有 n 個 d維向量 x1 x2,xn 小喵喵想知道是否存在兩個向量的內積為 k 的倍數。請幫助她解決這個問題。第一行包含 ...