HDU6146(2017百度之星程序设计大赛
来源:互联网 发布:个人网络循环贷款利率 编辑:程序博客网 时间:2024/05/21 11:06
【链接】
hdu6146
【题目大意】
给你一个
【解题报告】
这题其实就是一道DP题就是想转移方程有点复杂。
首先从简单的想,假设求从一个矩阵的一个角遍历所有节点一次且回到同一列的另一个节点的方案数。
那么很容易想到转移方程,定义
所以
进一步想,假设求从一个矩阵的一个角遍历所有节点一次的方案数。
经过仔细的思考,定义
所以
然后就可以推出从
然后就只剩考虑起点不是四个角的情况,我们可以枚举开始的列,定义
2表示当前列有两个起点可以作为起点,4表示两列之间可以互相走到的方案数。
所以答案就是
#include<cstdio>#define LL long longusing namespace std;const int maxn=10005,tt=1000000007;int T,n,ans,a[maxn],b[maxn];inline int Read(){ int res=0; char ch=getchar(); while (ch<'0'||ch>'9') ch=getchar(); while (ch>='0'&&ch<='9') res=res*10+ch-48,ch=getchar(); return res;}void Work(){ n=Read(); if (n==1) {printf("2\n"); return;} ans=(LL)4*a[n]%tt; for (int i=2; i<n; i++) ans=(((LL)ans+(LL)8*b[i-1]%tt*a[n-i]%tt)%tt+(LL)8*a[i-1]%tt*b[n-i]%tt)%tt; printf("%d\n",ans);}int main(){ freopen("6146.in","r",stdin); freopen("6146.out","w",stdout); b[1]=1; for (int i=2; i<=10000; i++) b[i]=b[i-1]*2%tt; a[1]=1; a[2]=6; for (int i=3; i<=10000; i++) a[i]=(b[i]+(LL)a[i-1]*2+(LL)a[i-2]*4)%tt; T=Read(); while (T--) Work(); return 0;}
- HDU6146(2017百度之星程序设计大赛
- Hdu6146 Pokémon GO(2017百度之星程序设计大赛
- HDU6146 Pokémon GO (2017百度之星程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 【2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- Spring--BeanFactory和ApplicationContext
- learning之状态模式
- 免费馅饼
- Ch’s gift HDU
- Java_19 文件输入/输出流
- HDU6146(2017百度之星程序设计大赛
- Queries Gym
- 《C++ Concurrency In Action》part2 线程管理
- Restful Api设计指南
- 搭建React开发环境(使用babel,webpack3)
- springboot->使用messagesSourcec处理字段验证抛出错误
- GNOME 默认文本编辑器 gedit 险失维护
- HDU 6168 Numbers【水题】
- bzoj4082 [Wf2014]Surveillance 倍增