hdu 2855 Fibonacci Check-up 矩阵快速幂&&模板
Fibonacci Check-up
Every ALPC has his own alpc-number just like alpc12, alpc55, alpc62 etc.
As more and more fresh man join us. How to number them? And how to avoid their alpc-number conflicted?
Of course, we can number them one by one, but that’s too bored! So ALPCs use another method called Fibonacci Check-up in spite of collision.
First you should multiply all digit of your studying number to get a number n (maybe huge).
Then use Fibonacci Check-up!
Fibonacci sequence is well-known to everyone. People define Fibonacci sequence as follows: F(0) = 0, F(1) = 1. F(n) = F(n-1) + F(n-2), n>=2. It’s easy for us to calculate F(n) mod m.
But in this method we make the problem has more challenge. We calculate the formula
, is the combination number. The answer mod m (the total number of alpc team members) is just your alpc-number.
Input
First line is the testcase T.
Following T lines, each line is two integers n, m ( 0<= n <= 10^9, 1 <= m <= 30000 )
Output
Output the alpc-number.
Sample Input
2 1 30000 2 30000
Sample Output
1 3
从s[0] 递推一下
可以发现 s[i] =f[2i]
这样通过矩阵快速幂求斐波那契数列就行了
1 1
1 0 是初始矩阵
剩下的套个矩阵快速幂的模板
[code]#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 3; int N, MOD; void multipy( int a[MAX_N][MAX_N], int b[MAX_N][MAX_N], int c[MAX_N][MAX_N] ){ for( int i = 1; i <= 2; i++ ){ for( int j = 1; j <= 2; j++ ){ c[i][j] = 0; for( int k = 1; k <= 2; k++ ){ c[i][j] = ( c[i][j] + a[i][k] * b[k][j] ) % MOD; } } } } void get_matrix_pow( int a[MAX_N][MAX_N], int n ){ int ans[MAX_N][MAX_N] = {0}; int temp[MAX_N][MAX_N]; for( int i = 1; i <= 2; i++ ) ans[i][i] = 1; while( n ){ if( n % 2 == 1 ){ multipy( ans, a, temp ); memcpy( ans, temp, sizeof( int ) * MAX_N * MAX_N ); } multipy( a, a, temp ); memcpy( a, temp, sizeof( int ) * MAX_N * MAX_N ); n /= 2; } memcpy( a, ans, sizeof( int ) * MAX_N * MAX_N ); } int main(){ int T; scanf( "%d", &T ); while( T-- ){ scanf( "%d%d", &N, &MOD ); if( N == 0 ){ printf( "%d\n", 0 ); continue; }else{ int a[MAX_N][MAX_N]; a[1][1] = 1;a[1][2] = 1; a[2][1] = 1;a[2][2] = 0; get_matrix_pow( a, 2 * N ); printf( "%d\n", a[2][1] ); } } return 0; }
- HDU - 2855 Fibonacci Check-up 矩阵快速幂
- hdu 2855 Fibonacci Check-up(矩阵乘法)
- HDU 2855 Fibonacci Check-up 矩阵
- HDU2855 Fibonacci Check-up 矩阵的应用
- 【HDU 2855】 Fibonacci Check-up (矩阵乘法)
- hdoj 2855 Fibonacci Check-up 【打表找规律 + 矩阵快速幂】
- hdu 2855 Fibonacci Check-up (矩阵)
- HDOJ 题目2855 Fibonacci Check-up(矩阵快速幂)
- hdu 2855 Fibonacci Check-up 矩阵+斐波那契通项公式
- HDU - 2855 Fibonacci Check-up 斐波那契矩阵
- hdu 2855 Fibonacci Check-up(犀利的推导公式)
- HDU1575[矩阵快速幂]模板
- hdu1575 Tr A(矩阵快速幂模板题)
- HDU 5171 GTY's birthday gift(矩阵快速幂模板)
- hdu 1575 求一个矩阵的k次幂 再求迹 (矩阵快速幂模板题)
- HDU 2855:Fibonacci Check-up_斐波拉契问题
- hdu 2855 Fibonacci Check-up
- hdu 5411 多校——矩阵快速幂模板
- HDU 1757 A Simple Math Problem (矩阵快速幂模板)
- hdu-2855 Fibonacci Check-up