求递推序列的第N项(斐波那契数列 数论 模拟 矩阵快速幂 打表 1126)
2019-08-02 09:52 木木王韦 阅读(141) 评论(0) 收藏 举报标题求递推序列的第N项
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
给出A,B和N,求f(n)的值。
输入
输入3个数:A,B,N。数字之间用空格分割。(-10000 <= A, B <= 10000, 1 <= N <= 10^9)
输出
输出f(n)的值。
输入样例
3 -1 5
输出样例
6
ac代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int f=2;
int mod=7;
struct node{
int m[11][11];
};
node mul(node a,node b){
node ans;
memset(ans.m ,0,sizeof(ans.m ));
for(int i=1;i<=f;i++){
for(int j=1;j<=f;j++){
for(int k=1;k<=f;k++){
ans.m[i][j] =(ans.m[i][j] +a.m[i][k]*b.m[k][j]%mod)%mod;
}
}
}
return ans;
}
node ksm(node a,long int b){
node res;
memset(res.m ,0,sizeof(res.m ));
for(int i=1;i<=f;i++){
res.m [i][i]=1;
}
while(b){
if(b&1){
res=mul(a,res);
/*for(int i=1;i<=f;i++){
for(int j=1;j<=f;j++){
cout<<bb.m [i][j]<<" ";
}
cout<<endl;
}*/
}
b>>=1;
a=mul(a,a);
/*for(int i=1;i<=f;i++){
for(int j=1;j<=f;j++){
cout<<a.m [i][j]<<" ";
}
cout<<"****"<<endl;
}*/
}
return res;
}
int main(){
long int A,B,n,b;
while(cin>>A>>B>>n){
if(n<=2){
cout<<"1"<<endl;
}
else{
if(A<0) A+=7;
if(B<0) B+=7;
node a,b1,b2;
a.m [1][1]=1;
a.m [1][2]=0;
a.m [2][1]=1;
a.m [2][2]=0;
b1.m [1][1]=A;
b1.m [1][2]=B;
b1.m [2][1]=1;
b1.m [2][2]=0;
/* for(int i=1;i<=f;i++){
for(int j=1;j<=f;j++){
cout<<b1.m [i][j]<<" ";
}
cout<<"%%%"<<endl;
}*/
b2=ksm(b1,n-2);
b2=mul(b2,a);
/*for(int i=1;i<=f;i++){
cout<<b2.m [i][1]<<endl;
}*/
cout<<(b2.m [1][1]+mod)%mod<<endl;
}
}
return 0;
}
浙公网安备 33010602011771号