原题地址:https://www.nowcoder.com/acm/contest/190/J
参考如何构造:https://blog.csdn.net/Akatsuki__Itachi/article/details/80443939
思路:我们可以观察数据范围发现, n n n和 m m m的差距特别大.然后 m m m最大只有 5 5 5并且我们经过递推可以发现当前列的状态只与前一列有关,所以这题很显然可以用状压 d p dp dp来写.但是 n n n又特别大,所以可以考虑使用矩阵快速幂来加快递推.
具体方法是先构造出递推的矩阵,然后讨一个矩阵快速幂的板子,最后直接统计个数就行了.
ac代码:
#include <bits/stdc++.h>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))