Fibonacci Check-up
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 672 Accepted Submission(s): 370
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.
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

Input
First line is the testcase T.
Following T lines, each line is two integers n, m ( 0<= n <= 10^9, 1 <= m <= 30000 )
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
Recommend
gaojie
//09年的一场多校联合赛的题目,推公式推了一天才搞定!设s[n]=sigma(C(n,k)*F(k)),打表之后发现规律S[n]=3*S[n-1]-S[n-2],这样其实就可以构造矩阵乘法解决了,但是这样的规律毕竟只是猜测的,需要证明出来着实不会!假想此公式成立,对于这样的等式构造二介特征方程解出来之后S[n]=1/sqrt(5)*(((3+sqrt(5))/2)^n - ((3-sqrt(5))/2)^5 ). 对于((3+sqrt(5)/2)^n=(6+2*sqrt(5)/4)^n= (1+sqrt(5)^2/2^2)^n=(1+sqrt(5)/2)^(2*n) 。所以可得S[n]=F[2*n],当然这只是猜想,但是由刚才的推导可以猜想如果把F[n]=1/sqrt(5)*(((1+sqrt(5))/2)^n-((1-sqrt(5))/2)^n)带入s[n]=sigma(C(n,k)*F(k))推导之后等式会怎样,果然得到F[2*n],所以本题其实就是让求F[2*n]。
#include<iostream>
using namespace std;
#define LL long long
LL fib_last(LL n,LL m)
{
if(n==0) return 0;
LL ret=1,next=1,ret_=ret;
LL flag=1,tt=n;
while(tt>>=1) flag<<=1;
while(flag>>=1)
{
if(n&flag)
{
ret_=ret*ret+next*next;
next=(ret+ret+next)*next;
}
else
{
ret_=(next+next+m-ret)*ret;
next=ret*ret+next*next;
}
ret=ret_%m;
next=next%m;
}
return ret;
}
int main()
{
int t;
LL n,m;
scanf("%d",&t);
while(t--)
{
scanf("%I64d%I64d",&n,&m);
printf("%I64d\n",fib_last(2*n,m)%m);
}
return 0;
}