51Nod 1126 求递推序列的第N项 矩阵快速幂

来源:互联网 发布:手机麻将源码带房卡 编辑:程序博客网 时间:2024/05/17 16:54

矩阵快速幂


对矩阵[a,b,1,0]求n-2次幂,

因为f[1]=f[2]=1。没有f[0],所以对矩阵[a,b,1,0]求n-2次幂,

又因为进行快速幂的时候令sum=n1,减少一次运算。所以是n-3次幂

注意会产生负数的情况假如a是负数 a%b=(a%b+b)%b

#include<iostream>  #include<queue>  #include<vector>  #include<stack>  #include<algorithm>#include<cmath> #include<set>#include<map>#include<cstdio>using namespace std;typedef struct node{int num[2][2];};node cheng(node n1,node n2){node sum;for(int i=0;i<2;i++){for(int j=0;j<2;j++){sum.num[i][j]=0;for(int k=0;k<2;k++){sum.num[i][j]+=(n1.num[i][k]*n2.num[k][j])%7;sum.num[i][j]=(sum.num[i][j]%7+7)%7;}}}return sum;}int k(node n1,int len){node sum=n1;while(len){if(len&1) sum=cheng(sum,n1);n1=cheng(n1,n1);len/=2;}return sum.num[0][0]+sum.num[0][1];}int main(){int a,b,n;cin>>a>>b>>n;node n1={(a%7+7)%7,(b%7+7)%7,1,0};if(n<=2){cout<<1<<endl;return 0;}if(n==3){printf("%d",((a+b)%7+7)%7);return 0;}int ksm=k(n1,n-3);cout<<(ksm%7+7)%7;return 0;}


阅读全文
1 0