洛谷

不知道大家做没做过传球游戏,这一题和传球游戏的转移方程几乎一样。

令\(A\)为\(1\)点,\(E\)为\(5\)点,那么\(f[i][j]\)代表第i步走到j的方案数。

\[f[i][j]=f[i−1][j+1]+f[i−1][j−1]
\]

因为题中给的是一个环,所以有几种情况。

\[if(j==8)~f[i][j]=f[i−1][1]+f[i−1][7]
\]

\[if(j==1)~f[i][j]=f[i−1][8]+f[i−1][2]
\]

还有,因为题中说,到了\(E\)点,就不会再动了。

\[if(j==4)~f[i][j]=f[i−1][3]
\]

\[if(j==6)~f[i][j]=f[i−1][7]
\]

边界很显然\(f[0][1]=1\)。但是我们注意这一题\(n≤10^7\),所以我们要滚动数组。

实际上我分析了一波,应该要用矩阵快速幂优化掉\(n\)那一维的,但是我交了一份递推代码上去也\(A\)了。

那么就不用管了,上代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
int f[2][9]={},n,t=0;
cin>>n;
f[t][1]=1;
for (int i=1;i<=n;++i) {
t=!t;
for (int j=1;j<=8;++j) {
if (j==1) f[t][j]=f[!t][8]+f[!t][j+1];
else if (j==8) f[t][j]=f[!t][j-1]+f[!t][1];
else if (j==4) f[t][j]=f[!t][j-1];
else if (j==6) f[t][j]=f[!t][j+1];
else f[t][j]=f[!t][j-1]+f[!t][j+1];
f[t][j]%=1000;
}
}
cout<<f[t][5];
return 0;
}

最新文章

  1. ubantu svn 安装、卸载、配置hooks
  2. Java的++自增
  3. Scala模式匹配语言,java的替代者
  4. jQuery小例子
  5. JAVA数据类型与DB2、Oracle、Sybase以及SQL Server对应关系
  6. February 29(模拟)
  7. 开源的C#实现WebSocket协议客户端和服务器websocket-sharp组件解析
  8. iphone开发笔记目录
  9. Css - 精灵图
  10. 2440nandflash启动过程再学习
  11. vue实例生命周期详解
  12. Spring mvc RequestContextHolder分析
  13. iOS开发-委托(Delegate)浅谈
  14. php 递归读取目录
  15. [翻译] MMMaterialDesignSpinner
  16. 通过xshell在linux上安装mysql5.7(终极版)
  17. 【甘道夫】Win7环境下Eclipse连接Hadoop2.2.0
  18. 10013: An attempt was made to access a socket in a way forbidden by its access permissions
  19. pat02-线性结构2. 一元多项式求导 (25)
  20. JS interview loop code

热门文章

  1. IOS使用Charts
  2. Oracle之sqlplus显示中文出现乱码
  3. 浅谈HTTPS协议和SSL、TLS之间的区别与关系
  4. Javaweb开发中关于不同地方出现的绝对路径和相对路径
  5. php安装redis扩展初始化失败解决办法
  6. Cocos3.0 的android返回键功能实现
  7. 同学帮帮移动 H5 弹出层类组件:txbb-pop
  8. pl/sql 实例精解 06
  9. Window对应的类为java.awt.Windows, 它可独立于其他Container而存在
  10. Windows编程中回调函数的使用心得(MFC篇)