連結:https://tioj.ck.tp.edu.tw/problems/1331

題目大意

給定 a,b,x,y 問下遞迴數列第 n 項的數值是多少,取其除以 232 的餘數:

{S0=aS1=bSn=xSn2+ySn1

題解

因為 n 的範圍是 109,很顯然的要用矩陣快速冪來計算。矩陣的構造方法就如同費式數列

[01xy]n[S0S1]=[SnSn+1]

利運快速冪來計算可以在 O(23logn) 計算出答案。

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;
//a*=b;
inline void mul(matrix &a, const matrix &b)
{
//static matrix c(2, vector<u32>(2)); //highlight.js render bug...
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';
}
}