传送门(其实就是求斐波那契数列....)

累了 明天再解释

做这道题需要一些关于矩阵乘法的基础知识。

1. 矩阵乘法的基础运算

只有当矩阵A的列数等于矩阵B的行数时,A与B可以相乘(A的行数不一定等于B的列数)。

代码实现(重载运算符):

struct matrix {
int ma[][];
};
matrix operator * (const matrix &A,const matrix &B) {
matrix C;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
for(int k = ; k < 3; k++)
C.ma[i][j] = C.ma[i][j] + A.ma[i][k] * B.ma[k][j];
return C;
}

2. 单位矩阵

主对角线上的元素都为1,其余元素全为0的n阶矩阵称为n阶单位矩阵,记为或  
 
 
可以通过模拟推出,任何其他矩阵 * 单位矩阵 = 它本身。
 

回到这道题:

因为 f[i] = f[i-1] + f[i-2],首先构造一个矩阵 [ f[i]  f[i-1] ]

它应该等于 [ f[i-1]  f[i-2] ] * A.

由于f[i] = f[i-1] *1 + f[i-2]*1,所以矩阵A的第一列应该都为1;

f[i-1] = f[i-1] *1 + f[i-2]*0,所以第二列为1和0;

得到以下公式
可以看出,求斐波那契数列即为求刚刚推导出的这个矩阵的n次幂;
这时就可以用快速幂来解决这道题了w
void quickpow(int b) {
while(b) {
if(b & ) ans = ans * base;
base = base * base;
b >>= ;
}
} int main() {
if(n <= ) {
printf("");
return ;
}
base.a[][] = base.a[][] = base.a[][] = ;
ans.a[][] = ans.a[][] = ;
quickpow(n - );
printf("%d",ans.a[][]);
return ;
}

  

(由于fibonacci数列的前两个数字=1已经给出,矩阵(f[2],f[1])即(1,1)是已知的,所以快速幂只要进行n-2次)
求的时候ans矩阵的第一个数即为答案。
 
 
  • 一个小优化:当base自乘时,求出的数组刚好为
     
  所以只要看n-1次的base[0][0]就可以了qwq(或者n次的base[0][1])

代码如下(我做的时候没有用重载运算符而是写了个函数来实现矩阵乘法的)

#include<cstdio>
#define ll long long
using namespace std;
const ll mod = ; struct matrix {
ll ma[][];
}; matrix ans;
ll n; matrix mul(matrix A,matrix B) {
matrix C;
C.ma[][] = C.ma[][] = C.ma[][] = C.ma[][] = ;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
for(int k = ; k < ; k++)
C.ma[i][j] += A.ma[i][k] * B.ma[k][j] % mod;
return C;
} matrix quickpow(matrix A,ll n) {
matrix B;
B.ma[][] = B.ma[][] = ;
B.ma[][] = B.ma[][] = ;
while(n) {
if(n&)B = mul(A,B);
A = mul(A,A);
n >>= ;
}
return B;
} int main() {
scanf("%lld",&n);
matrix A;
A.ma[][] = A.ma[][] = A.ma[][] = ;
A.ma[][] = ;
ans = quickpow (A,n);
printf("%lld",ans.ma[][]%mod);
return ;
}

最新文章

  1. C#实现XML与DataTable互转
  2. 用canvas画简单的“我的世界”人物头像
  3. 【国内独家首发】iPhone4 iOS7不完美越狱教程新鲜出炉
  4. Android SDK Manager更新报错
  5. 【题解】【字符串】【BFS】【Leetcode】Word Ladder
  6. JavaScript中常用函数(入门级)(持续更新)
  7. 基于Selenium2+Java的UI自动化(1) - 原理和环境搭建
  8. 一、cocos2d-x 3.0 final使用httpclient编译到android,须要用到的android.mk
  9. 将Eclipse代码导入到Android Studio的两种方式
  10. python 拼写检查代码(怎样写一个拼写检查器)
  11. 开发测试时给 Kafka 发消息的 UI 发送器――Mikasa
  12. MySQL中字符串与数字比较的坑
  13. o(n)线性排序算法
  14. 手机端 图片的移动缩放旋转兼容touch
  15. Unity3D项目程序加密-VirboxProtector加壳工具
  16. RabbitMQ在windows系统安装部署文档
  17. bzoj4710 [Jsoi2011]分特产(容斥)
  18. C# 使用EPPlus 秒导出10万条数据
  19. Go web编程实例
  20. Effective Java 第三版——76. 争取保持失败原子性

热门文章

  1. HDU5887(SummerTrainingDay01-D)
  2. BUGList
  3. 深入研究HTML5实现图片压缩上传
  4. eclipse没有server选项解决方法
  5. 排错-Loadrunner添加Windows&#160;Resource计数器提示“找不到网络路径”解决方法
  6. Android架构篇--MVP模式的介绍篇
  7. Android 震动模式
  8. 用Python实现数据结构之栈
  9. js计算两个日期的天数差值
  10. Head First Android --- Enable USB debugging on your device