Description
你有多少种方法用$2 \times 1$的多米诺骨牌填满$4 \times N$的矩形。
答案会很大,所以你只需输出答案模$M$的值。
Input
读入包括多组测试数据,以两个0结尾,每个测试点测试组数不超过10组。
每组数据包含两个整数,$N$,$M$。
Output
每行输出答案模$M$的值。
Sample Input
1 10000
3 10000
5 10000
0 0
Sample Output
1
11
95
Data Constraint
对于30%的数据,$1 \leq N \leq 8$。
对于80%的数据,$1 \leq N \leq 10 ^ 5$。
对于100%的数据,$1 \leq N \leq 10 ^ 9,1 \leq M \leq 10 ^ 5$。
80%解法
$4 \times N$,一看就是状压DP,设$f[i][j]$第i列状态为j的方案数,J的每一位上0表示对下一位无影响,1表示有影响,可知$ans = f[n][0]$。
可发现$f[i - 1][j]$和$f[i][k]$满足以下条件才可转移:
- j & k = 0(j 和 k 不能有某一位同时为1);
- j 和 k 都为0的位数必须为偶数并且连续。
可发现无论 i 为何值,j 状态是否能转移到 k 状态都是确定的,所以可以dfs做出转移矩阵,然后暴力转移,可拿到80分部分分。
100%解法
做出转移矩阵后可发现我们推出来的DP转移式可用矩阵乘法计算,则可以用矩阵快速幂加速。
注意几个可能出错的细节:矩阵乘法只满足乘法结合律,不满足乘法交换律,所以快速幂时注意相乘的顺序。
Code
1 | #include<cstdio> |