連結:https://tioj.ck.tp.edu.tw/problems/1331
題目大意
給定 問下遞迴數列第 項的數值是多少,取其除以 的餘數:
題解
因為 的範圍是 ,很顯然的要用矩陣快速冪來計算。矩陣的構造方法就如同費式數列
利運快速冪來計算可以在 計算出答案。
AC Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include<bits/stdc++.h> using namespace std;
using u32 = uint32_t; using matrix = vector<vector<u32>>; matrix A,T;
inline void mul(matrix &a, const matrix &b) { for(int i=0;i<2;++i) for(int j=0;j<2;++j) c[i][j]=a[i][0]*b[0][j]+a[i][1]*b[1][j]; a.swap(c); }
int main() { ios::sync_with_stdio(false); cin.tie(0);
u32 n,a,b,x,y; while( cin>>n, n<INT_MAX ) { cin>>a>>b>>x>>y; A = { { 0,1 }, { x,y } }; T = { { 1,0 }, { 0,1 } }; while( n ) { if( n&1 ) mul(T,A); mul(A,A); n/=2; } u32 ans = a*T[0][0] + b*T[0][1]; cout<<ans<<'\n'; } }
|