[bsoj1855] Fibonacci数列
来源:互联网 发布:乐视手机mac拨号 编辑:程序博客网 时间:2024/06/03 17:38
题目描述
Fibonacci数列是大家再熟悉不过的东东了.
由于吃完饭后没有什么事做,ChengYu决定计算Fibonacci数列的第n项来帮助消化,现在他希望你也做同样的事. ^_^ Fibonacci数列增长非常快,为了节约宝贵的纸张,所以只要计算答案除以1729的余数即可.
输入格式
多组数据,每行一个正整数n(n<=3456789012).
输出格式
对于每个输入,输出结果.
样例数据
样例输入
1
2
3
样例输出
1
1
2
题目分析
弱智题目,矩阵加速递推,也可以找循环节,略过。
源代码
找循环节
#include<algorithm>#include<iostream>#include<iomanip>#include<cstring>#include<cstdlib>#include<vector>#include<cstdio>#include<cmath>#include<queue>using namespace std;long long f[5005],n;int Fibonacci(int n) { f[1]=0;f[2]=1; for(int i=2;i<=n;i++) { f[0]=f[1]; f[1]=f[2]; f[2]=(f[1]+f[0])%1729; } return f[2]%1729;}int main() { while(cin>>n) { n%=1008; if(n==0)cout<<Fibonacci(1008)<<endl; else cout<<Fibonacci(n)<<endl; } return 0;}
矩阵快速幂
#include<algorithm>#include<iostream>#include<iomanip>#include<cstring>#include<cstdlib>#include<vector>#include<cstdio>#include<cmath>#include<queue>using namespace std;inline const int Get_Int() { int num=0,bj=1; char x=getchar(); while(x<'0'||x>'9') { if(x=='-')bj=-1; x=getchar(); } while(x>='0'&&x<='9') { num=num*10+x-'0'; x=getchar(); } return num*bj;}typedef long long LL;const int maxn=5,mod=1729;struct Matrix { LL n,m,a[maxn][maxn]; Matrix(LL n,LL m) { this->n=n; this->m=m; memset(a,0,sizeof(a)); } Matrix(LL n,LL m,char E) { //单位矩阵 this->n=n; this->m=m; memset(a,0,sizeof(a)); for(int i=1; i<=n; i++)a[i][i]=1; } void init(LL n,LL m) { this->n=n; this->m=m; memset(a,0,sizeof(a)); } LL* operator [] (const LL x) { return a[x]; } Matrix operator = (Matrix b) { init(b.n,b.m); for(int i=1; i<=b.n; i++) for(int j=1; j<=b.m; j++) a[i][j]=b[i][j]; } Matrix operator + (Matrix& b) { for(int i=1; i<=b.n; i++) for(int j=1; j<=b.m; j++) a[i][j]+=b[i][j]; } void operator += (Matrix& b) { *this=*this+b; } Matrix operator - (Matrix& b) { for(int i=1; i<=b.n; i++) for(int j=1; j<=b.m; j++) a[i][j]-=b[i][j]; } void operator -= (Matrix& b) { *this=*this-b; } Matrix operator * (LL k) { for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) a[i][j]*=k; } void operator *= (LL k) { *this=*this*k; } Matrix operator * (Matrix& b) { Matrix c(n,b.m); for(int i=1; i<=n; i++) for(int j=1; j<=b.m; j++) for(int k=1; k<=m; k++) c[i][j]=(c[i][j]+a[i][k]*b[k][j])%mod; return c; } void operator *= (Matrix& b) { *this=*this*b; } Matrix operator ^ (LL b) { Matrix ans(n,m,'e'),a=*this; while(b>0) { if(b&1)ans=ans*a; a*=a; b>>=1; } return ans; } void Output() { for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) printf("%lld ",a[i][j]); putchar('\n'); } }};LL n;int main() { Matrix a(1,2),b(2,2); a[1][1]=a[1][2]=1; b[1][1]=b[1][2]=b[2][1]=1; while(scanf("%lld",&n)!=EOF) { Matrix tmp=b^(n-2); printf("%lld\n",(a*tmp)[1][1]); } return 0;}
0 0
- [bsoj1855] Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- fibonacci数列
- CodeBlocks中常用的一些快捷键
- h5、原生
- [bzoj4700]适者
- substr_count计算***在某字符串中出现的次数;
- Protobuf3语言指南
- [bsoj1855] Fibonacci数列
- bzoj2120 数颜色
- Git 学习
- ob_start,ob_end_clean,ob_get_contents函数
- 使用Struts2的输入校验(三)--短路校验器
- 二项式定理
- 面向对象的特征之三多态性
- js移动端双指缩放和旋转
- 最简单的加法运算1001,1002