裴波拉契数列III
T
i
m
e
Time
Time
L
i
m
i
t
:
10000
M
S
Limit:10000MS
Limit:10000MS
M
e
m
o
r
y
Memory
Memory
L
i
m
i
t
:
65536
K
Limit:65536K
Limit:65536K
C
a
s
e
Case
Case
T
i
m
e
Time
Time
L
i
m
i
t
:
1000
M
S
Limit:1000MS
Limit:1000MS
Description
求数列 f [ n ] = f [ n − 1 ] + f [ n − 2 ] + 1 f[n]=f[n-1]+f[n-2]+1 f[n]=f[n−1]+f[n−2]+1的第 N N N项. f [ 1 ] = 1 , f [ 2 ] = 1 f[1]=1,f[2]=1 f[1]=1,f[2]=1.
Input
n ( 1 < n < 2 31 − 1 ) n(1<n<2^{31-1}) n(1<n<231−1)
Output
第 N N N项的结果 m o d mod mod 9973 9973 9973
Sample Input
12345
Sample Output
8932
分析:
矩阵乘法 与这个模板类似
同样 考虑矩阵
[
f
n
−
1
,
f
n
−
2
,
1
]
[f_{n-1},f_{n-2},1]
[fn−1,fn−2,1]
乘上某矩阵 得到
[
f
n
−
1
,
f
n
,
1
]
=
[
f
n
−
1
,
f
n
−
2
+
f
n
−
1
,
1
]
[f_{n-1},f_n,1]=[f_{n-1},f_{n-2}+f_{n-1},1]
[fn−1,fn,1]=[fn−1,fn−2+fn−1,1]
容易得出 该矩阵为:
0
,
1
,
0
0,1,0
0,1,0
1 , 1 , 0 1,1,0 1,1,0
0
,
1
,
1
0,1,1
0,1,1
然后直接做矩阵乘法就好了
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=9973;
long long n;
struct matrix{
long long n,m;
long long G[11][11];
}base,A,B;
matrix operator *(matrix a,matrix b)
{
matrix C;
C.n=a.n;C.m=b.m;
for(int i=1;i<=C.n;i++)
for(int j=1;j<=C.m;j++)
C.G[i][j]=0;
for(int k=1;k<=a.m;k++)
for(int i=1;i<=a.n;i++)
for(int j=1;j<=b.m;j++)
C.G[i][j]=(C.G[i][j]+a.G[i][k]*b.G[k][j]%mod)%mod; //矩阵乘法
return C;
}
void ksm(long long x){
if(x==1){
A=base;
return;
}
ksm(x/2);
A=A*A; //快速幂
if(x&1) A=A*base;
}
int main(){
scanf("%lld",&n);
base.n=3;base.m=3;
base.G[1][1]=0;base.G[1][2]=1;base.G[1][3]=0;
base.G[2][1]=1;base.G[2][2]=1;base.G[2][3]=0; //乘的矩阵
base.G[3][1]=0;base.G[3][2]=1;base.G[3][3]=1;
if(n<=2){
printf("1");
return 0;
}
else{
B.m=3;B.n=1;
B.G[1][1]=1;B.G[1][2]=1;B.G[1][3]=1; //设的矩阵
ksm(n-1);
B=B*A;
printf("%lld",B.G[1][1]);
}
return 0;
}