题目链接:http://poj.org/problem?

id=3070

题目大意:给定n和10000,求第n个Fibonacci数mod 10000 的值,n不超过2^31。

结果保留四位数字。

非常easy的题,和之前做过的相比简单非常多了。

构造最简单的斐波那契数列矩阵。

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int MAX = 2; struct Matrix
{
int v[MAX][MAX];
}; int n=2,M=10000; Matrix mtAdd(Matrix A, Matrix B) // 求矩阵 A + B
{
int i, j;
Matrix C;
for(i = 0; i < n; i ++)
for(j = 0; j < n; j ++)
C.v[i][j]=(A.v[i][j]+B.v[i][j])% M;
return C;
} Matrix mtMul(Matrix A, Matrix B) // 求矩阵 A * B
{
int i, j, k;
Matrix C;
for(i = 0; i < n; i ++)
for(j = 0; j < n; j ++)
{
C.v[i][j] = 0;
for(k = 0; k < n; k ++)
C.v[i][j] = (A.v[i][k] * B.v[k][j] + C.v[i][j]) % M;
}
return C;
} Matrix mtPow(Matrix origin,int k) //矩阵高速幂
{
int i;
Matrix res;
memset(res.v,0,sizeof(res.v));
for(i=1;i<=n;i++)
res.v[i][i]=1;
while(k)
{
if(k&1)
res=mtMul(res,origin);
origin=mtMul(origin,origin);
k>>=1;
}
return res;
} void out(Matrix A)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout<<A.v[i][j]<<" ";
cout<<endl;
}
cout<<endl;
} Matrix mtCal(Matrix A, int k) // 求S (k) = A + A2 + A3 + … + Ak
{
if(k == 1) return A;
Matrix B = mtPow(A, (k+1) / 2);
Matrix C = mtCal(A, k / 2);
if(k % 2 == 0)
return mtMul(mtAdd(mtPow(A, 0), B), C); // 如S(6) = (1 + A^3) * S(3)。
else
return mtAdd(A, mtMul(mtAdd(A, B), C)); // 如S(7) = A + (A + A^4) * S(3)
} int main ()
{
int num;
while (~scanf("%d",&num))
{
if(num==-1) break;
Matrix A;
A.v[0][0]=1;
A.v[0][1]=1;
A.v[1][0]=1;
A.v[1][1]=0;
Matrix ans=mtPow(A,num);
//out(ans);
cout<<ans.v[1][0]<<endl;
}
}

最新文章

  1. 百度地图 api
  2. springMVC 上传文件
  3. 怎么提高OCR文字识别软件的识别正确率
  4. Android 代码检查工具SonarQube
  5. Uestc_suibian 暑假集训总结
  6. 【面试题】如何让C语言自动发现泄漏的内存
  7. javascript基础学习(十三)
  8. Linux系统编程(24)——信号的生命周期
  9. UILabel显示html文本
  10. 移动端踩坑之旅-ios下fixed、软键盘相关问题总结
  11. 2016.3.17__CSS3动画__第十一天
  12. 弱网测试-Network Emulator 网络模拟工具使用
  13. chrome driver 下载
  14. October 22nd, 2017 Week 43rd Sunday
  15. [转]GAN论文集
  16. Asp.Net MVC参考资料
  17. nginx rewrite only specific servername to https
  18. JavaScript的基础语法
  19. Maven插件的简介,安装及在eclipse中配置
  20. 【第六周】关于beta测试组员评分标准的若干意见

热门文章

  1. 机器学习(4):数据分析的工具-pandas的使用
  2. jquery_final
  3. 模型搭建练习1_用numpy和tensor、variable实现前后向传播、实现激活函数
  4. ORACLE SQL*PLUS环境变量设置及说明
  5. Inno Setup打包的安装程序在Vista/Win7上自动提示需要管理员权限的方法
  6. PHP计算两个时间的年数、月数以及天数
  7. 利用mvn/maven如何检查依赖冲突,并解决依赖冲突
  8. Ambient Occulution
  9. 修改Linux基本配置
  10. 转:GRADLE构建最佳实践