Fibonacci Check-up
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1631 Accepted Submission(s): 929
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 , 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 )
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
#include<cstdio>
using namespace std;
int m;
int k, n;
typedef struct Matrix{
int a[100][100];
}Matrix;
Matrix mul(Matrix x, Matrix y, int row, int col)
{
Matrix c;
for(int i=1; i<=row; i++)
for(int j=1; j<=col; j++)
{
c.a[i][j]=0;
for(int k=1; k<=col; k++)
c.a[i][j]=(c.a[i][j]%m + (x.a[i][k]%m)*(y.a[k][j]%m))%m;
}
return c;
}
Matrix pow(Matrix x, int t)
{
Matrix c;
for(int i=1; i<=2; i++)
for(int j=1; j<=2; j++)
if(i==j)
c.a[i][j]=1;
else
c.a[i][j]=0;
while(t)
{
if(t&1)
{
c=mul(c, x, 2, 2);
}
x=mul(x, x, 2, 2);
t>>=1;
}
return c;
}
int main(){
Matrix A, B;
A.a[1][1]=A.a[1][2]=A.a[2][1]=1; A.a[2][2]=0;
B.a[1][1]=1; B.a[1][2]=1;
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
if(n==0)//这种求法一定要特判零, 一开始没特判,一直超时, 好气啊!
{
printf("0\n");
continue;
}
Matrix ans=pow(A, 2*n-2);
ans=mul(B, ans, 1, 2);
printf("%d\n", ans.a[1][1]);
}
return 0;
}