地址 http://poj.org/problem?id=3070

大意是输入一个数字 输出位于Fibonacci数列该位置的数字模10000的结果

由于n比较大 0 ≤ n ≤ 1,000,000,000 所以开数组是不可能了 只能实时计算

使用矩阵可以加速Fibonacci数列的推导

经过精心设置的矩阵相乘是可以从Fn-1 Fn-2推导出Fn的

那么设置好的矩阵的多次相乘是不是就可以从F0  F1推到出Fn呢?

是的 如图

1 1

1 0 矩阵为A那么

A^(n-1) 与F1 F0矩阵的乘法就是可以推到出 Fn

代码借用了之前的快速幂代码 不是模板 所以虽然可以AC但是代码复用性不好 先学理论 板子日后再找

 #include <iostream>
#include <vector>
#include <cstring> using namespace std; struct matrix {
int data[][];
}; int n = ;
int m = ;
int k = ; //矩阵乘法
matrix mul(matrix a, matrix b)
{
matrix c;
memset(c.data, , sizeof(c.data));
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
for (int k = ; k <= n; k++) {
c.data[i][j] = (c.data[i][j] + 1ll * a.data[i][k] * b.data[k][j]) % m;
}
}
} return c;
} //矩阵加法
matrix add(matrix a, matrix b) {
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
a.data[i][j] = (a.data[i][j] + b.data[i][j]) % m;
}
}
return a;
} //矩阵快速幂
matrix quickpow(matrix a, int k) {
matrix c;
memset(c.data, , sizeof(c.data));
for (int i = ; i <= n; i++)
c.data[i][i] = ;
while (k) {
if (k & ) c = mul(c, a);
k >>= ;
a = mul(a, a);
}
return c;
} int main()
{
int j;
while () {
cin >> j;
if (j == -) break;
if (j == ) {
cout << << endl; continue;
}
if (j == || j == ) {
cout << << endl; continue;
}
matrix base;
base.data[][] = ; base.data[][] = ;
base.data[][] = ; base.data[][] = ; matrix fn;
fn.data[][] = ;
fn.data[][] = ; matrix baseN = quickpow(base, j-); matrix c;
memset(c.data, , sizeof(c.data)); for (int i = ; i <= ; i++) {
for (int j = ; j <= ; j++) {
for(int k =;k<=;k++){
c.data[i][j] = (c.data[i][j] + 1ll * baseN.data[i][k] * fn.data[k][j]) % m;
}
}
}
cout << c.data[][] << endl;
}
return ;
}

ac code

poj 3070 矩阵计算Fibonacci的更多相关文章

  1. 【POJ 3070】 Fibonacci

    [题目链接]            点击打开链接 [算法]           矩阵乘法快速幂 [代码] #include <algorithm> #include <bitset& ...

  2. 矩阵快速幂 POJ 3070 Fibonacci

    题目传送门 /* 矩阵快速幂:求第n项的Fibonacci数,转置矩阵都给出,套个模板就可以了.效率很高啊 */ #include <cstdio> #include <algori ...

  3. POJ 3070 Fibonacci(矩阵高速功率)

    职务地址:POJ 3070 用这个题学会了用矩阵高速幂来高速求斐波那契数. 依据上个公式可知,第1行第2列和第2行第1列的数都是第n个斐波那契数.所以构造矩阵.求高速幂就可以. 代码例如以下: #in ...

  4. poj 3070 && nyoj 148 矩阵快速幂

    poj 3070 && nyoj 148 矩阵快速幂 题目链接 poj: http://poj.org/problem?id=3070 nyoj: http://acm.nyist.n ...

  5. POJ 3070 + 51Nod 1242 大斐波那契数取余

    POJ 3070 #include "iostream" #include "cstdio" using namespace std; class matrix ...

  6. (矩阵快速幂) Fibonacci -- poj -- 3070

    链接: http://poj.org/problem?id=3070   Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  7. 矩阵经典题目六:poj 3070 Fibonacci

    http://poj.org/problem?id=3070 按已构造好的矩阵,那么该矩阵的n次方的右上角的数便是f[n]. #include <stdio.h> #include < ...

  8. POJ 3070 Fibonacci

    Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. F ...

  9. POJ ---3070 (矩阵乘法求Fibonacci 数列)

    Fibonacci   Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2  ...

随机推荐

  1. C# - VS2019 WinFrm应用程序调用WebService服务

    WinFrm应用程序调用WebService服务 关于WebService的创建.发布与部署等相关操作不再赘述,传送门如下:C# VS2019 WebService创建与发布,并部署到Windows ...

  2. typeORM 多对多关系不同情况的处理

    本文以RBAC权限管理中的用户和角色举例,两个实体存在多对多的关系,一个用户拥有多个角色,一个角色属于多个用户.typeorm的中文文档没有对自定义中间表的说明,发现英文有相关说明,但示例代码貌似有问 ...

  3. Toggle the WinForms Ribbon Interface 切换 WinForms 功能区界面

    In this lesson, you will learn how to enable/disable the Ribbon User Interface in your application. ...

  4. Mac Electron 应用的签名(signature)和公证(notarization)

    背景 在MacOS 10.15之前,应用如果没有签名,那么首次打开时就会弹出这种“恶意软件”的提示框. 这时只要应用签名了,就不会弹这个框. 但在MacOS 10.14.5之后,应用如果没有公证(简单 ...

  5. SQL Server之批量清理数据库的死锁

    DECLARE killspid CURSOR  FOR (SELECT  CONVERT(VARCHAR(100), request_session_id)  FROM  sys.dm_tran_l ...

  6. IDEA编译报错Error:java: Compilation failed: internal java compiler error

    根据报错可以知道是编译某个模块报错, 接下来就是检查这个模块的编译版本 解决办法很简单:File-->Setting...-->Build,Execution,Deployment--&g ...

  7. MySQL数据库~~~~~索引

    1. 索引 索引在MySQL中也叫"键"或者"key",是存储引擎于快速找到记录的一种数据结构. 索引的数据结构: B+树 B+树性质: 索引字段要尽量小; 索 ...

  8. MySQL数据库~~~~pymysql 连接 MySQL的客户端

    import pymysql conn = pymysql.connect( host = '127.0.0.1', # 主机 port = 3306, # 端口号 user = 'root', # ...

  9. 表单生成器(Form Builder)之伪造表单数据番外篇——随机车辆牌照

    前几天记录了一下表单生成器(Form Builder)之表单数据存储结构mongodb篇,之后便想着伪造一些数据.为什么要伪造数据呢?说来惭愧,因为拖拉拽设计表单以及表单对应的列表的PC端和移动端该显 ...

  10. docx和doc的区别

    docx和doc这两者间就相差一个字母x,可就是这一个简简单单的x有时候也会引申出很多的问题,比如这个案例,在一次研究生期末考试的考查课上,老师要求每个人事先结合自己的思路以及该课程,写一篇报告总结, ...