这道题目可以先转化:

令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 广义斐波那契数列的更多相关文章

  1. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  2. 矩阵乘法快速幂 codevs 1574 广义斐波那契数列

    codevs 1574 广义斐波那契数列  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 广义的斐波那契数列是指形如 ...

  3. Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)

    Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...

  4. P1349 广义斐波那契数列(矩阵加速)

    P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如an=pan-1+qan-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an ...

  5. 洛谷P1349 广义斐波那契数列(矩阵快速幂)

    P1349 广义斐波那契数列 https://www.luogu.org/problemnew/show/P1349 题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定 ...

  6. 洛谷——P1349 广义斐波那契数列(矩阵加速)

    P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如$an=p\times a_{n-1}+q\times a_{n-2}$?的数列.今给定数列的两系数$p$和$q$,以及数列的最前两项 ...

  7. codevs1574广义斐波那契数列

    1574 广义斐波那契数列  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond     题目描述 Description 广义的斐波那契数列是指形如an=p* ...

  8. 「Luogu 1349」广义斐波那契数列

    更好的阅读体验 Portal Portal1: Luogu Description 广义的斐波那契数列是指形如\(an=p \times a_{n-1}+q \times a_{n-2}\)的数列.今 ...

  9. P1349 广义斐波那契数列(矩阵乘法)

    题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...

随机推荐

  1. c/c++小知识

    1.printf计算参数时是从右到左 2.(int&)a 表示把a在内存中的值强行当作int数来处理 3.float四字节,1位符号位(正数为0),8位指数位(0采取01111111),23位 ...

  2. datagrid实现行的上移和下移

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  3. Spring多数据源的配置和使用

    1. 配置多个数据源 最近开发一个数据同步的小功能,需要从A主机的Oracle数据库中把数据同步到B主机的Oracle库中.当然能够用dmp脚本或者SQL脚本是最好,但是对于两边异构的表结构来说,直接 ...

  4. shelve模块

    #coding:utf-8 __author__ = 'similarface' #email:similarface@outlook.com ''' shelve模块: 映射容器 存储对象,被存储的 ...

  5. JQuery & Javascript

    Jquery 是一个优秀的javascript框架,是轻量级的js库 jQuery简化了javascript 编程 jQuery很容易学习

  6. golang作为server向android提供数据服务

    中间交换的数据是json ,后台数据库服务器是sqlserver2012 android通过post或者get方式访问 如get方式http://192.168.255.13:7080/tblFile ...

  7. Lecture Notes: Macros

    原论文链接失效,特在这里保存一份 http://www.apl.jhu.edu/~hall/Lisp-Notes/Macros.html Lisp functions take Lisp values ...

  8. js正则标志/g /i /m的用法,以及实例

    js正则标志/g /i /m的用法,以及实例   正则的思想都是一样的,但是具体的写法会有所不同,在这里提到的/g,/i,/m在其他的地方也许就不能用了. 一,js正则标志/g,/i,/m说明 1,/ ...

  9. mysql关于编码部分(乱码出现的原因和解决方法)

    在使用mysql客户端时,我们会经常出现一个这样一个问题,就是原先好好文字,怎么输入之后就出现乱码了呢? 出现这样的问题: 第一个原因: 可能是这是我们新安装的一个mysql,没有经过配置,第二个原因 ...

  10. java多线程的常用方法(以及注意事项)

    /* * 线程的常用方法 * 1.start(); * 2.run(); * 3.sleep(int millsecond); * 4.isAlive(); -->判断线程是否还在运行 * 5. ...