HDU 5451 广义斐波那契数列
这道题目可以先转化:
令f(1) = 5+2√6
f(2) = f(1)*(5+2√6)
...
f(n) = f(n-1)*(5+2√6)
f(n) = f(n-1)*(10-(5-2√6)) = 10*f(n-1)-(5-2√6)f(n-1) = 10*f(n-1) - 10/(5+2√6) f(n-1) = 10*f(n-1) - 10/(5+2√6) * (5+2√6)f(n-2)
= 10*f(n-1) - f(n-2)
那么就可以写成矩阵相乘的形式了
(f(n) , f(n-1)) = (f(n-1) , f(n-2)) (10 , 1
-1 , 0)
但这里2^x+1还是很大,这里就用到广义斐波那契数列找循环节的思想
循环节长度 = (mod-1)*(mod+1)
具体证明可以参考这里: 广义斐波那契数列
那么只要求出对模循环节后的长度进行幂运算就行了
但这里f(i)都是带根号的小数 , 这里就选择用近似的整数代替
5+2√6 = 9.89...
f(0) = (5+2√6)^0 = 1
f(1) = (5+2√6)^1 = 5+2√6
/*囧 想了半天我还是不知道为什么f(0)用2代替 , f(1)用10代替就一定保证之后取到的都是上顶*/
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define ll long long
int n,q;
ll MOD;
struct Matrix{
int m[][];
void init(){m[][]=m[][]=;m[][]=m[][]=;}
Matrix operator*(const Matrix &p) const{
Matrix ret;
for(int i= ; i< ; i++)
for(int j= ; j< ; j++){
ret.m[i][j]=;
for(int k= ; k< ; k++){
ret.m[i][j] = (ret.m[i][j]+((ll)m[i][k]*p.m[k][j])%MOD)%MOD;
}
}
return ret;
}
}; int qpow(int b)
{
ll ret= , a=;
while(b){
if(b&) ret = ret*a%MOD;
a = a*a%MOD;
b>>=;
}
return ret;
} Matrix qpow(Matrix a , int b)
{
Matrix ret;
ret.init();
while(b){
if(b&) ret = ret*a;
a = a*a;
b>>=;
}
return ret;
} int main()
{
// freopen("a.in" , "r" , stdin);
int T , cas=;
scanf("%d" , &T);
while(T--)
{
scanf("%d%d" , &n , &q);
MOD = (q-)*(q+);
n = qpow(n);
MOD = q;
Matrix a;
a.m[][]= , a.m[][]=- , a.m[][]= , a.m[][]=;
a = qpow(a , n);
ll val = (ll)*a.m[][]+(ll)*a.m[][];
val = ((val%MOD)+MOD)%MOD;
printf("Case #%d: %I64d\n" , ++cas , (val+MOD-)%MOD);
}
return ;
}
HDU 5451 广义斐波那契数列的更多相关文章
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
codevs 1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如 ...
- Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...
- P1349 广义斐波那契数列(矩阵加速)
P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如an=pan-1+qan-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an ...
- 洛谷P1349 广义斐波那契数列(矩阵快速幂)
P1349 广义斐波那契数列 https://www.luogu.org/problemnew/show/P1349 题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定 ...
- 洛谷——P1349 广义斐波那契数列(矩阵加速)
P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如$an=p\times a_{n-1}+q\times a_{n-2}$?的数列.今给定数列的两系数$p$和$q$,以及数列的最前两项 ...
- codevs1574广义斐波那契数列
1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如an=p* ...
- 「Luogu 1349」广义斐波那契数列
更好的阅读体验 Portal Portal1: Luogu Description 广义的斐波那契数列是指形如\(an=p \times a_{n-1}+q \times a_{n-2}\)的数列.今 ...
- P1349 广义斐波那契数列(矩阵乘法)
题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...
随机推荐
- [css] 自适应布局 移动端自适应
一.宽度自适应 三列布局左右固定.中间不固定或者两列布局,左边固定右边不固定 原文链接:http://www.cnblogs.com/2050/archive/2012/07/30/2614852.h ...
- sqlserver 2008 服务器拒绝连接;拒绝访问指定的数据库
sqlserver配置管理器----sqlserver网络配置 --- 启用 named pipes OK 由于之前的程序是SQL2000开发的,迁移到SQL20008出了这个问题. 二 和主题没有什 ...
- 【linux 命令】:查看系统开机,关机时间【转载】
转载原文:http://www.cnblogs.com/kerrycode/p/3759395.html 看Linux开机关机时间的方法(非常全面) 1: who 命令查看 who -b 查看最后一次 ...
- 强制关闭tomcat
ps -ef |grep tomcat //找到tomcat的端口号 kill - tomcatpid
- OpenGL的视图变换、模型变换、投影变换、视口变换
产生目标场景的过程类似于用照相机进行拍照: (1) 把照相机固定在三角架上,并让他对准场景从不同位置观察场景(视图变换) gluLookAt (2) 对场景进行安排,使各个物体在照片中的位置是我们所希 ...
- python网络编程socket之多线程
#coding:utf-8 __author__ = 'similarface' import os,socket,threading,SocketServer SERVER_HOST='localh ...
- vs调试 LINK : fatal error LNK1104 ...exe
出现错误 LINK : fatal error LNK1104 ...exe (1)任务管理器中杀死...exe (2)此工程是复制过来的,但之前的已经装入内存,所以不能打开.重启VS即可.
- Intellij IDEA-can't use subversion command line client : svn
http://www.myexception.cn/cvs-svn/1935962.html
- Hive中JOIN操作
1. 只支持相等JOIN. 2. 多表连接当使用不同的列进行JOIN时,会产生多个MR作业. 3. 最后的表的数据是从流中读取,而前面的会在内存中缓存,因此最好把最大的表放在最后. SELECT /* ...
- laravel 中 与前端的一些事1
首先安装node.js 在命令行中敲node -v 可以查看node的版本信息 还需要安装npm,相当于php中的composer node.js中5.0版本后的都已经将npm打包进node了 还要安 ...