矩阵快速幂——佳佳的斐波那契
佳佳的斐波那契
佳佳对数学,尤其对数列十分感兴趣。
在研究完 Fibonacci 数列后,他创造出许多稀奇古怪的数列。
例如用 S(n) 表示 Fibonacci 前 n 项和 modm 的值,即 S ( n ) = ( F 1 + F 2 + … + F n ) m o d m , 其 中 F 1 = F 2 = 1 , F i = F i − 1 + F i − 2 S(n)=(F_1+F_2+…+F_n)modm,其中 F_1=F_2=1,F_i=F_{i−1}+F_{i−2} S(n)=(F1+F2+…+Fn)modm,其中F1=F2=1,Fi=Fi−1+Fi−2。
可这对佳佳来说还是小菜一碟。
终于,她找到了一个自己解决不了的问题。
用 T ( n ) = ( F 1 + 2 F 2 + 3 F 3 + … + n F n ) m o d m T(n)=(F_1+2F_2+3F_3+…+nF_n)modm T(n)=(F1+2F2+3F3+…+nFn)modm表示 Fibonacci 数列前 n 项变形后的和 modm 的值。
现在佳佳告诉你了一个 n 和 m,请求出 T(n) 的值。
输入格式
共一行,包含两个整数 n 和 m。
输出格式
共一行,输出 T(n) 的值。
数据范围
1 ≤ n , m ≤ 2 31 − 1 1≤n,m≤2^{31}−1 1≤n,m≤231−1
输入样例:
5 5
输出样例:
1
样例解释
T ( 5 ) = ( 1 + 2 × 1 + 3 × 2 + 4 × 3 + 5 × 5 ) m o d 5 = 1 T(5)=(1+2×1+3×2+4×3+5×5)mod5=1 T(5)=(1+2×1+3×2+4×3+5×5)mod5=1
题解:
推理如下:
T n = f 1 + 2 f 2 . . . + n f n Tn=f_1+2f_2...+nf_n Tn=f1+2f2...+nfn
n S n − T n = ( n − 1 ) f 1 + ( n − 2 ) f 2 . . . f n − 1 nS_n-T_n=(n-1)f_1+(n-2)f_2...f_{n-1} nSn−Tn=(n−1)f1+(n−2)f2...fn−1
( n + 1 ) S n + 1 − T n + 1 = ( n ) f 1 + ( n − 1 ) f 2 . . . f n (n+1)S_{n+1}-T_{n+1}=(n)f_1+(n-1)f_2...f_{n} (n+1)Sn+1−Tn+1=(n)f1+(n−1)f2...fn
下面减去上面我们发现就是 s n s_n sn
令 p n = n ∗ s n − T n p_n=n*s_n-T_n pn=n∗sn−Tn
因为 t n = n ∗ s n − p n t_n=n*s_n-p_n tn=n∗sn−pn
又因为 p n − p n − 1 = s n − 1 p_n-p_{n-1}=s_{n-1} pn−pn−1=sn−1
所以我们可以根据 p n , s n p_n,s_n pn,sn推出 p n p_n pn并且A矩阵中不存在未知量。
用向量 [ f i , f i + 1 , s n , p n ] [f_i,f_{i+1},s_n,p_n] [fi,fi+1,sn,pn]就可以了
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int mod;
struct mat {ll a[4][4], n;mat() { memset(a, 0, sizeof(a)); }void matE() {for (int i = 0; i < n; i++)a[i][i] = 1;}inline mat operator+(const mat &T) const {mat res;res.n = n;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)res.a[i][j] = (a[i][j] + T.a[i][j] + mod) % mod;return res;}inline mat operator-(const mat &T) const {mat res;res.n = n;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)res.a[i][j] = (a[i][j] - T.a[i][j] + mod) % mod;return res;}inline mat operator*(const mat &T) const {mat res;res.n = n;ll r;for (int i = 0; i < n; ++i)for (int k = 0; k < n; ++k) {r = a[i][k];for (int j = 0; j < n; ++j)res.a[i][j] += T.a[k][j] * r,res.a[i][j] %= mod;}return res;}inline mat pow(ll x) {mat res, bas;res.n = bas.n = n;for (int i = 0; i < n; i++) res.a[i][i] = 1;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++) bas.a[i][j] = a[i][j];while (x) {if (x & 1) res = res * bas;x >>= 1;bas = bas * bas;}for (int i = 0; i < n; i++)for (int j = 0; j < n; j++) a[i][j] = res.a[i][j];return res;}
}f,a,res;
int main()
{int n; cin>>n>>mod;f.n=a.n=4;a.a[0][1]=a.a[1][0]=a.a[1][1]=a.a[1][2]=a.a[2][2]=a.a[2][3]=a.a[3][3]=1;f.a[0][0]=f.a[0][1]=f.a[0][2]=1;int k=n-1;a.pow(k);res=f*a;cout<<(n*res.a[0][2]-res.a[0][3]+mod)%mod<<endl;
}
矩阵快速幂——佳佳的斐波那契相关推荐
- [发布] 矩阵乘法及其对于编程求斐波那契数列的某一项的应用
需要PDF的读者可以向我索要. 如果发现有翻印与用于商业用途,将予追究. ======================================= 编者注:本文中如果没有特殊说明,除法均只取整数 ...
- 星际密码(矩阵快速幂)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 星际战争开展了100年之后,NowCoder终于破译了外星人的密 ...
- hdu3117 斐波那契前后4位
题意: 求斐波那契的前后4位,n <= 10^8. 思路: 至于前四位,和hdu1568的求法一样: http://blog.csdn.net/u013761 ...
- (详解)矩阵快速幂详解与常见转移矩阵的构造
目录 转移矩阵求解套路 常见转移矩阵1-斐波那契矩阵 承接套路 常见转移矩阵2-类斐波那契数列 常见转移矩阵3-幂常数 前缀和 具体DP问题 ----------------------------- ...
- 矩阵小专题(矩阵快速幂+矩阵加速)
1.什么是矩阵? 矩阵(数学术语)_百度百科 2.矩阵快速幂 首先要知道,只有n*n的矩阵能乘以自身(否则不符合矩阵相乘的条件) 然后要明白普通的快速幂的原理(本质是把幂次二分,代码如下) inlin ...
- 算法笔记_001:斐波那契数的多种解法(Java)
本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第 ...
- python实现连续数列相加_技术 | Python经典面试题解析实现斐波那契数列
黑马程序员 微信号:heiniu526 传智播客旗下互联网资讯,学习资源免费分享平台 大家在面试过程中经常会考到斐波那契数列,斐波那契数列(Fibonacci)最早由印度数学家Gopala提出,而第一 ...
- MATLAB基础教程(5)——斐波那契数列
目录 前言 正文开始啦: 总体思路: 首先创建文件: 编写 fibo_use.m 文件的内容代码 编写 fibonacci_mine.m 文件中的代码 代码运行 总结: 前言 斐波那契数列是一个很有趣 ...
- MATLAB新手简明使用教程(四)——斐波那契数列——新手来看,保证看懂。
前期回顾 在上一篇我们学习了下面 的知识点: 使用roots函数求一元二次方程的根. 使用solve函数求方程的根. 使用inline函数和ezplot函数一起绘制函数图形. 使用 fzero 函数和 ...
最新文章
- .NET设计模式(2):单件模式(Singleton Pattern)
- 暑期训练狂刷系列——Foj 1894 志愿者选拔 (单调队列)
- python矩阵左除_matlab学习笔记
- 【JAVA基础篇】多线程
- C++ std::tr1::shared_ptr使用说明
- hive集群安装,连接mysql
- Putty工具包简单使用
- [工作积累] error: bad class file magic (cafebabe) or version (0033.0000)
- .Net中的并行编程-6.常用优化策略
- 如何区分同一Class的不同实例对象
- drools rule (二) LHS语法详解
- android平板机,HTC首款Android平板机发布
- Linux安装samba服务
- XML转换为dataframe
- taskctl控制容器之定时器个人理解
- 计算机毕业设计django基于python企业资产管理系统
- 这款录屏神器在 GitHub 火了,秒杀 33 种同类工具!
- 递归求2+2+22+222+............
- JAVA梅森旋转随机算法_伪随机数生成算法-梅森旋转(Mersenne Twister/MT)
- 通过CMMI5的国内企业有几个?这个认证是不是很牛啊? - 知乎