Jzoj4787 数格子
来源:互联网 发布:威廉.菲德内尔 知乎 编辑:程序博客网 时间:2024/05/16 10:16
题意:用1x2的骨牌填满4xN的格子的方案数
设f[i][j]表示填到第i行,这一行的状态为j的方案数
f[i][j]=Σf[i-1][k],其中k->j是一个合法转移
合法转移要满足两个条件:
1.若k的第x位为0,那么j的第x位一定要为1 (~k|j==j)
2.k,j都为一的位置必须是偶数个且必须连续,即k&j的二进制不能出现单独一个1,例如0101不合法,0011和0110都合法
这样就可以转移了,最后可以用矩阵加速
#include<stdio.h>#include<string.h>#define L long longconst int w[5]={0,3,6,12,15};int n,M;struct Mat{int n,m;int s[16][16];Mat(){ memset(s,0,sizeof s); }void clr(){ memset(s,0,sizeof s); }void set(int x,int y){ n=x; m=y; }Mat operator * (const Mat& b){Mat c; c.set(n,b.m);for(int i=0;i<n;++i)for(int j=0;j<b.m;++j)for(int k=0;k<m;++k)c.s[i][j]=(c.s[i][j]+(L)s[i][k]*b.s[k][j])%M;return c;}} a,b;bool ok(int x){for(int i=0;i<5;++i) if(x==w[i]) return 1;return 0;}void pow(int k){for(;k;b=b*b,k>>=1) if(k&1) a=a*b;}int main(){a.set(1,16); b.set(16,16);begin:a.clr(); b.clr();for(int i=0;i<16;++i)for(int j=0;j<16;++j)if(((~i&15)|j)==j&&ok(i&j)) b.s[i][j]=1;a.s[0][15]=1;scanf("%d%d",&n,&M);if(n&&M){pow(n);printf("%d\n",a.s[0][15]);goto begin;}}
阅读全文
1 0
- [JZOJ4787] 数格子
- 【JZOJ4787】数格子
- Jzoj4787 数格子
- NOIP提高组【JZOJ4787】数格子
- 【jzoj4787】【数格子】【 状态压缩动态规划】【矩阵快速幂】
- JZOJ4787. 【NOIP2016提高A组模拟9.17】数格子
- {题解}[jzoj4787]【NOIP2016提高A组模拟9.17】数格子
- 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子
- 格子取数问题
- 数格子,,简单bfs
- 【JZOJ 4787】 数格子
- 【NOIP模拟】数格子
- JZOJ 4787. 数格子
- 【JZOJ 4787】数格子
- 格子取数问题
- 格子取数2
- 格子取数3
- 格子取数问题
- 秋招面试经验分享-阿里,cvte,迅雷,网龙,美团,已拿Offer
- 一个简单的多线程的大数据信息检索程序
- leetcode 2 Add Two Numbers【更新】
- 字符编码详解——彻底理解掌握编码知识,“乱码”不复存在
- 数据库左连接右连接
- Jzoj4787 数格子
- bower安装完成后,无法执行bower install jquery等命令?
- vue 2.0 v-for 初体验
- 二分k均值聚类
- redis应用【二】 -- redis的几种数据结构
- 人脑理解递归
- 测试系列-Charles https协议怎么抓
- 1007计算(a+b)*c的值
- 阿里云服务器centos7.3上配置redis--sentinel等