题目描述

输入

输出

样例输入

1 10000

3 10000

5 10000

0 0

样例输出

1

11

95

数据范围



每个测试点数据组数不超过10组

解法

状态压缩动态规划。

设f[i][j]表示第i行状态为j的方案数:

f[i][j]=sum(f[i−1][k])(其中j可以从k中转移过来)

预处理出所有转移合法的情况。

然后矩阵乘法优化即可。

代码

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define ln(x,y) ll(log(x)/log(y))
#define sqr(x) ((x)*(x))
using namespace std;
const char* fin="aP2.in";
const char* fout="aP2.out";
const ll inf=0x7fffffff;
const ll maxn=100007,maxk=1<<4;
ll n,m,i,j,k;
bool ok[maxk][maxk];
struct rect{
ll data[maxk][maxk];
void init(){
memset(data,0,sizeof(data));
}
rect(){
init();
}
rect operator *(const rect &b){
rect c;
ll i,j,k;
for (i=0;i<maxk;i++)
for (j=0;j<maxk;j++)
for (k=0;k<maxk;k++){
c.data[i][k]=(c.data[i][k]+data[i][j]*b.data[j][k])%m;
}
return c;
}
void operator =(const rect &b){
ll i,j;
for (i=0;i<maxk;i++) for (j=0;j<maxk;j++) data[i][j]=b.data[i][j];
}
rect power(ll b){
rect a=*this,c;
ll i,j,k=0;
while (b){
if (b&1)
{
if (k) c=c*a;
else{
k=1;
c=a;
}
}
a=a*a;
b>>=1;
}
return c;
}
}a,b;
void init(){
ll i,j,k;
for (i=0;i<maxk;i++)
for (j=0;j<maxk;j++){
b.data[j][i]=1;
for (k=1;k<=4;k++){
if (j&(1<<(k-1))){
if (i&(1<<(k-1))){
if (k<4){
if (!((j&(1<<k)) && (i&(1<<k)))){
b.data[j][i]=0;
break;
}
k++;
}else{
b.data[j][i]=0;
break;
}
};
}else{
if (!(i&(1<<(k-1)))){
b.data[j][i]=0;
break;
}
}
}
}
}
int main(){
init();
while (1){
scanf("%d%d",&n,&m);
if (n==0) break;
a.init();
a.data[0][maxk-1]=1;
a=a*b.power(n);
printf("%d\n",a.data[0][maxk-1]);
}
return 0;
}

启发

矩阵乘法可以用来优化状态较少的滚动的状态压缩动态规划。

最新文章

  1. One Step github链接
  2. codeforces 711B - Chris and Magic Square(矩阵0位置填数)
  3. Linux 命令执行结果输出到屏幕的同时写入到文件中
  4. BNUOJ1067生成函数入门
  5. HDU5709 : Claris Loves Painting
  6. TableLayout(表格布局)
  7. Spring 事务配置管理,简单易懂,详细 [声明式]
  8. Ubuntu安装wps for linux
  9. Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析
  10. pyqt5消息框QMessageBox
  11. HINTERNET 句柄
  12. zoj 2770 Burn the Linked Camp
  13. css 颜色表示法
  14. 20165214 2018-2019-2 《网络对抗技术》Exp2 后门原理与实践 Week4
  15. Study 2 —— 格式化输出
  16. asp.net core 支付宝支付( 电脑2.0)
  17. forever 启动nodejs
  18. NBPL团队总结
  19. Java多线程(二) —— 深入剖析ThreadLocal
  20. Sentence-seven basic patterns 英语句子结构

热门文章

  1. agc034
  2. Django项目:CRM(客户关系管理系统)--56--47PerfectCRM实现CRM客户报名流程01
  3. Web交互增强
  4. 记一次server 2008 R2的按装过程
  5. 深入学习:Windows下Git新手教程(下)
  6. HNOI 2019 多边形
  7. 20190921-雅礼Day1
  8. 做移动应用使用地图API时需要注意的问题
  9. 全栈数据工程师养成攻略:Python 基本语法
  10. 为GitLab配置邮件服务