HDOJ 题目2855 Fibonacci Check-up(矩阵快速幂)
2014-11-05 09:55
429 查看
Fibonacci Check-up
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1173 Accepted Submission(s): 661
Problem Description
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
Source
2009 Multi-University Training
Contest 5 - Host by NUDT
Recommend
gaojie | We have carefully selected several similar problems for you: 1588 2254 1757 2971 2294
思路:http://blog.csdn.net/xuzengqiang/article/details/7645020
在这里顺便贴下斐波那契数列的通项公式:
我们可以利用这个公式来简化很多运算:例HDU 2855,意思是输入n,m,求
%m的结果。
具体推导过程如下:
ac代码
#include<stdio.h> #include<string.h> #include<math.h> struct s { int m[2][2]; }; int n,mm; struct s muti(struct s a,struct s b) { int i,j,k; struct s c; memset(c.m,0,sizeof(c.m)); for(i=0;i<2;i++) { for(j=0;j<2;j++) { for(k=0;k<2;k++) { c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mm; } c.m[i][j]%=mm; } } return c; } struct s powm(struct s a,int n) { struct s b; memset(b.m,0,sizeof(b.m)); b.m[0][0]=b.m[1][1]=1; while(n) { if(n&1) b=muti(b,a); a=muti(a,a); n/=2; } return b; } int main() { int t; scanf("%d",&t); while(t--) { //int n,m; struct s e,ans; e.m[0][0]=e.m[0][1]=e.m[1][0]=1; e.m[1][1]=0; scanf("%d%d",&n,&mm); if(n==0) { printf("0\n"); continue; } n*=2; ans=powm(e,n); printf("%d\n",ans.m[0][1]); } }
相关文章推荐
- hdoj 2855 Fibonacci Check-up 【打表找规律 + 矩阵快速幂】
- HDU - 2855 Fibonacci Check-up 矩阵快速幂
- hdu 2855 Fibonacci Check-up (矩阵)
- HDU2855 Fibonacci Check-up 矩阵的应用
- hdu 2855 Fibonacci Check-up 矩阵+斐波那契通项公式
- 【HDU 2855】 Fibonacci Check-up (矩阵乘法)
- HDU - 2855 Fibonacci Check-up 斐波那契矩阵
- hdu 2855 Fibonacci Check-up(矩阵乘法)
- HDOJ 题目1588 Gauss Fibonacci(矩阵快速幂,矩阵加,二分)
- HDOJ 题目4549 M斐波那契数列(数学,矩阵快速幂,费马小定理)
- HDU 2855 Fibonacci Check-up 矩阵
- hdoj 4990 Reading comprehension(矩阵快速幂)
- 【矩阵快速幂】LightOJ_1132_Summing up Powers
- hdu 2855(矩阵快速幂)
- hdoj 4767 Bell 【矩阵快速幂 + CRT】
- hdu 2855 Fibonacci Check-up
- HDOJ 4549 M斐波那契数列 矩阵快速幂+欧拉降幂公式
- HDU 2855:Fibonacci Check-up_斐波拉契问题
- HUD - 1575 - Tr A ( 矩阵快速幂,简单题目 )
- hdu 2855 Fibonacci Check-up