标签:
链接:点击打开链接
题意:求从第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