[2017百度之星程序设计大赛- 复赛] C
来源:互联网 发布:网络言论自由的特点 编辑:程序博客网 时间:2024/06/06 04:07
我们设 Bn 代表从某个角出发,然后走遍所有格子回到同一列的方案数目。
Bn=2×Bn−1=2n−1
同样,我们设 An 代表从某个角出发,然后走遍所有格子的方案数。
则 An=Bn+2×An−1+4×An−2
其中 Bn 代表回到了当前列的方案数, An−1 代表先填满当前列然后走到相邻的列处理同样的一个子问题,
An−2 代表通过对角线方式先走完当前列与相邻列的格子,然后剩下的 n−2 列即相同子问题。
因为有四个角,所以我们的结果要乘以 4 ,即 4×An 。
当然,真实情况下我们不一定是从四个角出发的,还有另一种情况就是中间的列
考虑中间的第 i 列
我们可以先从第 i 列往左走完所有的格子回来,然后再往右走完所有的格子;
也可以先往右走完所有的格子回来,再往左走完所有的格子。
于是总的方案数即 2×(4×Bi−1×An−i+4×Bn−i×Ai−1) ,其中 2 代表第 i 列有两个格子可选为初始点, 4 代表分别向左右两边行走时的选择方案数 2×2 。
#include<cstdio>#define ll long longconst int N=10010,P=1000000007;ll a[N],b[N],n;int T;int main(){register int i,j; b[1]=1; for (i=2;i<=N;i++) b[i]=(b[i-1]*2)%P; a[1]=1;a[2]=6; for (i=3;i<=N;i++) a[i]=(2*a[i-1]+b[i]+4*a[i-2])%P; scanf("%d",&T); for (j=1;j<=T;j++){ int n;scanf("%d",&n);ll ans=0; for (i=2;i<=n-1;i++) ans=(ans+16*b[i-1]%P*a[n-i])%P; ans=(ans+4*a[n])%P; if (n==1) ans=2; printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- [2017百度之星程序设计大赛- 复赛] C
- HDU-2017"百度之星"程序设计大赛-复赛-补题
- HDU-2017"百度之星"程序设计大赛-复赛-1001-Arithmetic of Bomb
- HDU-2017"百度之星"程序设计大赛-复赛-1003-Pokémon GO
- HDU-2017"百度之星"程序设计大赛-复赛-1005-Valley Numer
- HDU-2017"百度之星"程序设计大赛-复赛-1006-Valley Numer II
- 2007年百度之星程序设计大赛试题复赛题目 Robots.txt 协议
- 2005年百度之星程序设计大赛试题复赛的解答(八方块移动游戏)
- 赛题集锦—2008年百度之星程序设计大赛复赛题目
- 百度之星2009程序设计大赛 晋级赛(复赛)试题
- 2006年百度之星程序设计大赛复赛 第1题 另类杀人游戏
- PHP 求解:2006年百度之星程序设计大赛复赛题目:另类杀人游戏
- php解:2006 年百度之星程序设计大赛复赛题目 4 ----彩球游戏
- hdu 5258 数长方形-2015年百度之星程序设计大赛 - 复赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 【2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- poj 1753 Flip Game(dfs)
- Linux curl 中get和post的用法详解
- shell脚本小技巧
- linux各发行版本的系统资源获取方式调研
- IDEA中常用的快捷键
- [2017百度之星程序设计大赛- 复赛] C
- 树莓派-使用xrdp实现windows 远程桌面linux
- 第五章 第三节:比较运算符与函数
- 堆(heap)
- Javascript 容易忽视的语法点
- Log4j2.xml配置
- servlet知识点总结
- Luogu 1972(主席树)
- 在ubuntu中安装opencv