hit2060

来源:互联网 发布:yield python 编辑:程序博客网 时间:2024/06/07 19:50

链接:点击打开链接

题意:求从第a个到第b个的斐波那契和

代码(有两个,第二个不用判断边界):

#include <iostream>#include <stdio.h>#include <math.h>#define mod 1000000000using 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 1000000000using 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;}

0 0
原创粉丝点击