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
hdu2855
解题思路:这题我也不会推,打表可以得到结论。。。
G(n) = 3 * G(n-1) - G(n-2),G函数表示![]()
这题要注意最后求得的可能是负数,所以最后要处理一下AC代码:
#include<cstdio> #include<cstring> #include<algorithm> #define maxn 31 int n, k, mod; struct Matrix { int ma[3][3]; }; Matrix multi(Matrix a, Matrix b) { Matrix ans; memset(ans.ma, 0, sizeof(ans.ma)); int i, j, k; for(i=1; i<=n; ++i) for(j=1; j<=n; ++j) for(k=1; k<=n; ++k) ans.ma[i][j] = (ans.ma[i][j] + a.ma[i][k]*b.ma[k][j]%mod) % mod; return ans; } Matrix pow(Matrix a, int x) { Matrix ans; memset(ans.ma, 0, sizeof(ans.ma)); int i, j; for(i=1; i<=n; ++i) ans.ma[i][i] = 1; while(x) { if(x & 1) ans = multi(ans, a); a = multi(a, a); x >>= 1; } return ans; } int main() { int t; Matrix ans, a; scanf("%d", &t); while(t--) { scanf("%d%d",&k,&mod); if(k==0) { printf("%d\n",k)%mod; continue; } n = 2; ans.ma[1][1] = 3; ans.ma[1][2] = 1; ans.ma[2][1] = -1; ans.ma[2][2] = 0; ans = pow(ans, k-1); memset(a.ma, 0, sizeof(a.ma)); a.ma[1][1] = 1; ans = multi(a, ans); printf("%d\n",(ans.ma[1][1] + mod)%mod); //结果可能为负数,要处理一下 } return 0; }