标签:
链接:点击打开链接
题意:求从第a个到第b个的斐波那契和
代码(有两个,第二个不用判断边界):
#include <iostream> #include <stdio.h> #include <math.h> #define mod 1000000000 using namespace std; struct node{ long long m[3][3]; }; node P={1,1,0, 1,0,0, 1,1,1}; node I={1,0,0, 0,1,0, 0,0,1}; //s(n)=s(n-1)+f(n)=s(n-1)+f(n-1)+f(n-2) node mul(node a,node b){ //因为有一项为n-2因此只有n大于2时才能用这个公式 int i,j,k; node c; for(i=0;i<3;i++) for(j=0;j<3;j++){ c.m[i][j]=0; for(k=0;k<3;k++){ c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod; } c.m[i][j]%=mod; } return c; } //矩阵乘法 node quickmod(int n){ node a,b; a=P;b=I; while(n){ if(n&1) b=mul(b,a); n>>=1; a=mul(a,a); } return b; } //矩阵快速幂 int main(){ //也就是矩阵连乘的模板 int a,b,i,j,sumsum,sumsum1; node sum,sum1; while(scanf("%d%d",&a,&b)!=EOF&&(a||b)){ if(a==0||a==1){ if(b==1&&a==0){ printf("2\n"); continue; } if(b==1&&a==1){ printf("1\n"); continue; } //边界讨论 sum=quickmod(b-1); sumsum=sum.m[2][0]+sum.m[2][1]+2*sum.m[2][2]; sumsum=(sumsum%mod-1+mod)%mod; printf("%d\n",sumsum); } else{ sum=quickmod(b-1); sum1=quickmod(a-2); sumsum=sum.m[2][0]+sum.m[2][1]+2*sum.m[2][2]; sumsum1=sum1.m[2][0]+sum1.m[2][1]+2*sum1.m[2][2]; sumsum=(sumsum%mod-sumsum1%mod+mod)%mod; printf("%d\n",sumsum); } } return 0; }
#include <iostream> #include <stdio.h> #include <math.h> #define mod 1000000000 using namespace std; struct node{ long long m[3][3]; }; node P={1,1,0, 1,0,0, 1,0,1}; node I={1,0,0, 0,1,0, 0,0,1}; //s(n)=s(n-1)+f(n)=s(n-1)+f(n-1)+f(n-2) node mul(node a,node b){ int i,j,k; node c; for(i=0;i<3;i++) for(j=0;j<3;j++){ c.m[i][j]=0; for(k=0;k<3;k++){ c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod; } c.m[i][j]%=mod; } return c; } //矩阵乘法 node quickmod(int n){ node a,b; a=P;b=I; while(n){ if(n&1) b=mul(b,a); n>>=1; a=mul(a,a); } return b; } //矩阵快速幂 int main(){ //也就是矩阵连乘的模板 int a,b,i,j,sumsum,sumsum1; node sum,sum1; while(scanf("%d%d",&a,&b)!=EOF&&(a||b)){ // if(a==0||a==1){ // if(b==1&&a==0){ // printf("2\n"); // continue; // } // if(b==1&&a==1){ // printf("1\n"); // continue; // } //边界讨论 // sum=quickmod(b); // sumsum=sum.m[2][0]+sum.m[2][1]+2*sum.m[2][2]; // sumsum=(sumsum%mod-1+mod)%mod; // printf("%d\n",sumsum); // } // else{ sum=quickmod(b); sum1=quickmod(a-1); sumsum=sum.m[2][0]+sum.m[2][2]; sumsum1=sum1.m[2][0]+sum1.m[2][2]; sumsum=(sumsum%mod-sumsum1%mod+mod)%mod; printf("%d\n",sumsum); // } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/stay_accept/article/details/47661175