http://nyoj.top/problem/1273

状压dp+矩阵快速幂+dfs

1273-宣传墙

  • 内存限制:64MB 时间限制:1000ms 特判: No
  • 通过数:19 提交数:64 难度:4

题目描述:

ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多。CBA 镇长准备在一条道路南 面 4*N 的墙上做一系列的宣传。为了统一规划,CBA 镇长要求每个宣传栏只能占相邻的两个方格 位置。但这条道路被另一条道路分割成左右两段。CBA 镇长想知道,若每个位置都贴上宣传栏, 左右两段各有有多少种不同的张贴方案。 例如: N=6,M=3, K=2, 左,右边各有 5 种不同的张贴方案


输入描述:

第一行: T 表示以下有 T 组测试数据 ( 1≤T ≤8 )
接下来有T行, 每行三个正整数 N M K 分别表示道路的长度,另一条道路的起点和宽度
(1≤ N ,M ≤ 1 000 000, 1≤ K ≤ 100000)

输出描述:

每组测试数据,输出占一行:两个整数,分别表示左右两段不同的张贴方案数。由于方案总数
可能很大,请输出对 997 取模后的结果。

样例输入:

复制

2
6 3 2
5 3 2

样例输出:

5 5
5 1

一开始按poj铺砖块的裸题写),直接与处理1e6的答案,tle了。

然后把1e6的数据粘在数组里交,告诉我代码太长。。。

然后发现只有4行,那么直接把所有的可能转移的状态都写出来,题目放过了这种做法。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int mod = 997;
const int max_n= 1e6+5;
int dp[max_n][1<<4];
int main(){dp[0][0]=1;for(int i=0;i<=1e6+1;i++){dp[i+1][0]=(dp[i+1][0]+dp[i][0]+dp[i][3]+dp[i][9]+dp[i][12]+dp[i][15])%mod;dp[i+1][3]=(dp[i][0]+dp[i][12]+dp[i+1][3])%mod;dp[i+1][9]=(dp[i][0]+dp[i][6]+dp[i+1][9])%mod;dp[i+1][12]=(dp[i+1][12]+dp[i][0]+dp[i][3])%mod;dp[i+1][15]=(dp[i][0]+dp[i+1][15])%mod;dp[i+1][6]=(dp[i+1][6]+dp[i][9])%mod;}int T;cin>>T;while(T--){int n,m,k;cin>>n>>m>>k;int a=m-1;int b=n-a-k;cout<<dp[a][0]<<' '<<dp[b][0]<<endl;}return 0;
}

如果不是4行,而是x行,如果n到达1e10,只有用矩阵快速幂+dfs+状压dp了。

通过上面发现f(n)的每一个状态都是由f(n-1)的每一个状态转移而来,那么就直接上矩阵快速幂

用dfs构造转移的矩阵。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int mod = 997;
const int max_n= 1e6+5;
LL nn;
struct mat{LL m[17][17];
};
mat unit,init; //单位矩阵
mat matmul(mat a,mat b){mat re;memset(re.m,0,sizeof(re.m));for(int i=0;i<nn;i++){for(int j=0;j<nn;j++){for(int k=0;k<nn;k++){re.m[i][j]=(re.m[i][j]+a.m[i][k]*b.m[k][j])%mod;}}}return re;
}
mat quickmod(LL x,mat jin){mat re;memset(re.m,0,sizeof(re.m));for(int i=0;i<nn;i++) re.m[i][i]=1;while(x){if(x&1)re=matmul(re,jin);x=x>>1;jin=matmul(jin,jin);}return re;
}void dfs(int j,int h,int st,int toth){ //前一列满,当前列二进制是j,后一列二进制是stif(h==toth+1) {     //递归出口unit.m[st][j]=1; //构造矩阵。return ;}if((j&(1<<(h-1)))>0) {  //当前行不能放dfs(j,h+1,st,toth);return;}if(h==toth){        //最后一行只能横着放dfs(j,h+1,st+(1<<(h-1)),toth);return ;}dfs(j,h+1,st+(1<<(h-1)),toth);if((j&(1<<(h)))==0)  //竖着放dfs(j,h+2,st,toth);
}
int main(){memset(unit.m,0,sizeof(unit.m)); //单位矩阵for(int i=0;i<1<<4;i++){dfs(i,1,0,4);}memset(init.m,0,sizeof(init.m)); //初始矩阵init.m[0][0]=1;int T;cin>>T;while(T--){int n,m,k;cin>>n>>m>>k;int a=m-1;int b=n-a-k;nn=1<<4;mat ans1=quickmod(a,unit);ans1=matmul(init,ans1);mat ans2=quickmod(b,unit);ans2=matmul(init,ans2);cout<<ans1.m[0][0]<<' '<<ans2.m[0][0]<<endl;}return 0;
}

第九届河南省赛 宣传墙 //状压dp+矩阵快速幂+dfs相关推荐

  1. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  2. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  3. 2018.09.28 hdu5434 Peace small elephant(状压dp+矩阵快速幂)

    传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后 ...

  4. 湘潭赛Easy wuxing(递推+矩阵快速幂or DP)

    湘潭赛Easy wuxing(递推+矩阵快速幂or DP) 十分感谢老师的思路! 题目描述 "五行"是中国传统哲学思想,它认为认为大自然的现象由"木.火.土.金.水&qu ...

  5. nyoj1273 河南省第九届省赛_宣传墙、状压DP+矩阵幂加速

    宣传墙 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...

  6. 中石油训练赛 - Watch Later(状压dp)

    题目链接:点击查看 题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去 ...

  7. [蓝桥杯][2019年第十届真题]糖果(状压dp)

    题目描述 糖果店的老板一共有 M 种口味的糖果出售.为了方便描述,我们将 M 种 口味编号 1 ∼ M. 小明希望能品尝到所有口味的糖果.遗憾的是老板并不单独出售糖果,而 是 K 颗一包整包出售. 幸 ...

  8. 【NOIP模拟】T2 管道(状压dp求图的dfs序方案数)

    f[i][j]: i表示整个图走没走过的状态 j表示当前到了第j个点 存的值就是在这种情形下 可以走到的地方的状态 dp[i][j]:i表示整个图走没走过的状态 j表示当前在j点 访问剩余能去到的点的 ...

  9. CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)E.飞行棋(期望dp+矩阵快速幂)

    题目 飞行棋的规则如下: 1.每名玩家有一个棋子,每个回合可以掷一次骰子. 2.如果使用的骰子为 k面,则这 k面上的点数分别为 1,2,3,-,k,且掷得每种点数的概率均为​. 3.如果当前回合掷得 ...

最新文章

  1. IoC~MVC3+EF+Autofac实现松耦合的系统架构 [转载]
  2. 5-3 最长连续递增子序列 (20分)
  3. make file教程(转)
  4. 二分法——leetcode35. 搜索插入位置
  5. 数字孪生及其在航空航天中的应用
  6. 管理系统中计算机应用 重点章节,11年《管理系统中计算机应用》 第5章 重点要点.doc...
  7. 电大计算机网络技术基础,电大--2016年电大 计算机与网络技术基础小抄已排版.doc...
  8. CISA提醒:UPS联网设备正遭攻击
  9. Guangsoushensou 2
  10. easyui添加删除表格任意行
  11. Android SDK下载和安装,以及部署
  12. Win10 PowerToys官方免费效率小工具集
  13. 白硕:人工智能的诗与远方,一文读懂NLP起源、流派和技术
  14. 可能是最详细的Win10+黑苹果双系统安装教程(For Dell 7580)
  15. 池化层MaxPool函数详解及反向传播的公式推导
  16. 无聊做做数学题系列1 - 正弦定理及三角公式
  17. gateway网关调用报 reactor.netty.http.client.HttpClient.chunkedTransfer(Z)Lreactor/netty/http/client/HttpC
  18. kindle特性和硬件介绍(不介绍操作和使用方法)
  19. logo制作软件 Ai怎么设计创意LOGO
  20. 对称加密算法AES - ECB模式

热门文章

  1. android磁场传感器页面布局在哪,教程:Android传感器—传感器查询demo
  2. 系统集成项目管理工程师学习
  3. java异地登录验证_同一帐号异地登录
  4. 求助:truffle unbox pet-shop时truffle test出错
  5. 数学图形(2.2)N叶结
  6. Freebie:专业业务信息图表模板
  7. 《计算机是怎样跑起来的》学习笔记
  8. 只做了delete操作,为啥 ORACLE-01466表定义已更改
  9. 切比雪夫不等式例题讲解_浅谈|f(x)|最大值的最小值问题--切比雪夫最佳逼近直线在高考中的应用...
  10. 使用nvs管理node版本