码迷,mamicode.com
首页 > 其他好文 > 详细

hit2060

时间:2015-08-14 15:49:36      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:

链接:点击打开链接

题意:求从第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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

hit2060

标签:

原文地址:http://blog.csdn.net/stay_accept/article/details/47661175

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!