/*
有两种多米诺骨牌,1种2X1,另一种2X2,请问N个多米若骨牌放到2×N的框子里有多少中组合
1->1
2->3
3->5
4->11
f(n)=f(n-1)+2Xf(n-2)
f(0)=f(1)=1
*/
有两种多米诺骨牌,1种2X1,另一种2X2,请问N个多米若骨牌放到2×N的框子里有多少中组合
1->1
2->3
3->5
4->11
f(n)=f(n-1)+2Xf(n-2)
f(0)=f(1)=1
*/
输入:
5
1
1
10000
40000
20000
40000
20000
39999
50000
39999
输出:
0
6251
6251
3
30933
#include <stdio.h>
#define MAX_N 100001
int N,M;
int dp[MAX_N];
int Answer;
int foo(int n)
{
int i;
for (i = 0; i <= n; i++)
{
if (i == 0 || i == 1)
dp[i] = 1 % M;
else
dp[i] = (dp[i - 1] + 2 * dp[i - 2]) % M;
}
return dp[n];
}
int main(void)
{
int test_case;
int T;
freopen("E_DominoTiling_input.txt", "r", stdin);
setbuf(stdout, NULL);
scanf("%d", &T);
for(test_case = 0; test_case < T; test_case++)
{
scanf("%d", &N);
scanf("%d", &M);
/**********************************
* Implement your algorithm here. *
**********************************/
Answer = foo(N);
// Print the answer to standard output(screen).
printf("%d\n", Answer);
}
return 0;
}