# hdu5451Best Solver=矩阵快速幂+广义斐波拉契

Problem Description
The so-called best problem solver can easily solve this problem, with his/her childhood sweetheart.

It is known that y=(5+26)1+2x.$y=(5+2\sqrt6)^{1+2^x}.$
For a given integer x (0≤x<2^32) and a given prime number M (M≤46337), print [y]%M. ([y] means the integer part of y)

Input
An integer T (1< T≤1000), indicating there are T test cases.
Following are T lines, each containing two integers x and M, as introduced above.

Output
The output contains exactly T lines.
Each line contains an integer representing [y]%M.

Sample Input

7
0 46337
1 46337
3 46337
1 46337
21 46337
321 46337
4321 46337

Sample Output

Case #1: 97
Case #2: 969
Case #3: 16537
Case #4: 969
Case #5: 40453
Case #6: 10211
Case #7: 17947

Source
2015 ACM/ICPC Asia Regional Shenyang Online

http://blog.csdn.net/xtulollipop/article/details/52373948

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<set>
using namespace std;
#define pi acos(-1.0)
#define EPS 1e-6    //log(x)
#define e exp(1.0); //2.718281828
//#define mod 1000000007
#define INF 0x7fffffff
#define inf 0x3f3f3f3f
typedef long long LL;

#define debug(x) cout<<x<<endl;
#define debug2(x) cout<<x<<" ";

//#define MOD 10000007
LL MOD;
struct Mat{
int n,m;
LL mat[9][9];
};
Mat operator *(Mat a,Mat b){
Mat c;
memset(c.mat,0,sizeof(c.mat));
c.n = a.n,c.m = b.m;

for(int i=1;i<=a.n;i++){
for(int j=1;j<=b.m;j++){
for(int k=1;k<=a.m;k++){
c.mat[i][j] += (a.mat[i][k]*b.mat[k][j])%MOD;
c.mat[i][j] %= MOD;
}
}
}
return c;
}
Mat operator +(Mat a,Mat b){
Mat c;
memset(c.mat,0,sizeof(c.mat));
c.n = a.n,c.m = a.m;

for(int i=1;i<=a.n;i++){
for(int j=1;j<=a.m;j++){
c.mat[i][j] = (a.mat[i][j]+b.mat[i][j])%MOD;
}
}
return c;
}
Mat operator ^(Mat a,LL k){
Mat c;
memset(c.mat,0,sizeof(c.mat));
c.n = a.n,c.m = a.n;
for(int i=1;i<=a.n;i++)c.mat[i][i] = 1;

while(k){
if(k&1){
c = c*a;
}
a = a*a;
k>>=1;
}
return c;
}
void out(Mat a){
for(int i=1;i<=a.n;i++){
for(int j=1;j<=a.m;j++){
printf(j==a.m? "%I64d\n":"%I64d ",a.mat[i][j]);
}
}
}
LL quickPow(LL x, LL n, LL mm)
{
LL a = 1;
while (n)
{
a *= n&1 ? x : 1;
a %= mm;
n >>= 1 ;
x *= x;
x %= mm;
}
return a;
}
int main()
{
int T_T;
scanf("%d",&T_T);
LL x,m;
int cas=0;
while(T_T--){
scanf("%I64d %I64d",&x,&m);
printf("Case #%d: ",++cas);
MOD=m;
LL tempmod=m*m-1;
LL n=quickPow(2,x,tempmod)+1;
if(n==0){
printf("1\n");
continue;
}
else if(n==1){
printf("9\n");
continue;
}
Mat pp;
pp.n=pp.m=2;
pp.mat[1][1]=5%MOD;
pp.mat[1][2]=12%MOD;
pp.mat[2][1]=2;
pp.mat[2][2]=5%MOD;

Mat A0;
A0.n=2,A0.m=1;
A0.mat[1][1]=5%MOD;
A0.mat[2][1]=2;

Mat ans=pp^(n-1);
ans=ans*A0;

printf("%I64d\n",(2*ans.mat[1][1]-1+MOD)%MOD);
}
return 0;
}

/*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\  =  /O
____/---'\____
.'  \\|     |//  .
/  \\|||  :  |||//  \
/  _||||| -:- |||||-  \
|   | \\\  -  /// |   |
| \_|  ''\---/''  |   |
\  .-\__  -  ___/-. /
___. .'  /--.--\  . . __
."" '<  .___\_<|>_/___.'  >'"".
| | :  - \.;\ _ /;./ -  : | |
\  \ -.   \_ __\ /__ _/   .- /  /
======-.____-.___\_____/___.-____.-'======
=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I have a dream!A AC deram!!
orz orz orz orz orz orz orz orz orz orz orz
orz orz orz orz orz orz orz orz orz orz orz
orz orz orz orz orz orz orz orz orz orz orz

*/

`

• 本文已收录于以下专栏：

## hdu5451（矩阵快速幂+广义斐波拉契）

• shutdown113
• 2017年12月10日 17:06
• 33

## hdu2256Problem of Precision+矩阵快速幂+广义斐波拉契

Problem DescriptionInput The first line of input gives the number of cases, T. T test cases follow,...
• xtulollipop
• 2016年08月31日 10:53
• 212

## hdu4565So Easy!+矩阵快速幂+广义斐波拉契

Problem Description 　　A sequence Sn is defined as: Where a, b, n, m are positive integers.┌x┐is ...
• xtulollipop
• 2016年08月31日 11:02
• 186

## 矩阵快速幂求斐波那契数列（初学整理）

• NYIST_TC_LYQ
• 2016年10月31日 13:27
• 7578

## hdu-4549 M斐波那契数列【矩阵快速幂】

• a915800048
• 2016年04月19日 12:01
• 243

## poj 3070 Fibonacci 【矩阵快速幂 求第N个斐波那契数%1000】

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11123   Acc...
• chenzhenyu123456
• 2015年08月30日 20:01
• 2256

## 算法学习笔记（五） 递归之 快速幂、斐波那契矩阵加速

• thisinnocence
• 2014年08月17日 20:19
• 3197

## 斐波拉契快速求法：矩阵快速幂

• daniel_csdn
• 2016年03月01日 22:07
• 174

## [HDU 5451] Best Solver （向下取整+矩阵快速幂+广义Fibonacci降幂）

HDU - 5451 y=(5+26√)1+2xy = (5+2\sqrt{6})^{1+2^x} 给定 xx和 质数MM，求 ⌊y⌋%M\lfloor y\rfloor\%M 首先 xx很...
• u012015746
• 2016年08月09日 10:16
• 262

## hdu 5451 Best Solver -广义斐波那契+矩阵快速幂+共轭构造+循环节

http://acm.hdu.edu.cn/showproblem.php?pid=5451 方法类似http://blog.csdn.net/viphong/article/details/529...
• viphong
• 2016年10月31日 13:07
• 161

举报原因： 您举报文章：hdu5451Best Solver=矩阵快速幂+广义斐波拉契 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)