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
- hit2060
- hit2060
- HIT2060 Fibonacci Problem Again
- hit2060 Fibonacci Problem Again
- 导出gmail邮件
- 直方图均衡化
- 用在计时器上的“神器”------Timer
- YUV(一)-数据格式分析
- Kurento应用开发指南(以Kurento 5.0为模板) 之三:示例教程 一对多的视频呼叫
- hit2060
- 使用SharedPreferences记住密码的功能
- SAP生产机速度慢的一些解决方法
- ajax动态加载下拉框、单选框、复选框
- 希尔(Shell)排序
- 黑马程序员——java复习总结——其他类和IO流
- 累了就会(ˇˍˇ) 想~爸爸想妈妈
- Java Foreach语句使用总结
- 通道的拆分与合并