[luogu4285 SHOI2008] 汉诺塔 (暴力,数学)
2024-10-01 01:47:12
Solution
强行猜测公式形如\(f_i=k\times f_{i-1}+b\),暴力求\(f_1,f_2,f_3\),剩下的递推就行
Code
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
const int N=40;
int n;
long long f[N],top[4],t[4][N];
char ch[3];
struct M{int fr,to;}mv[10];
int get(int x) {
F(i,1,x) t[1][i]=x-i+1;
top[1]=x;top[2]=top[3]=0;
int res=0,las=0;
while(1) {
if(top[2]==x||top[3]==x) return res;
F(i,1,6) {
int u=mv[i].fr,v=mv[i].to;
if(u==las||!top[u]||(t[u][top[u]]>t[v][top[v]]&&top[v])) continue;
t[v][++top[v]]=t[u][top[u]];
t[u][top[u]--]=0;las=v;
res++;break;
}
}
}
int main() {
n=read();
F(i,1,6) scanf("%s",ch+1),mv[i].fr=ch[1]-'A'+1,mv[i].to=ch[2]-'A'+1;
f[1]=get(1);f[2]=get(2);f[3]=get(3);
int k=(f[3]-f[2])/(f[2]-f[1]),b=f[3]-f[2]*k;
F(i,4,n) f[i]=k*f[i-1]+b;
printf("%lld",f[n]);
return 0;
}
最新文章
- VSS转SVN
- 小心一些,断言可能让你的造成循环引用NSAssert
- 苹果 Mac OS 下查看系统隐藏文件
- ubuntu vi/vim编辑器必知必会
- C#(类)
- 慕课网-安卓工程师初养成-4-7 Java循环语句之 while
- Sublime字体设置
- inline和宏之间的区别
- DrawText的使用
- BZOJ 2718: [Violet 4]毕业旅行( 最长反链 )
- Codeforces.765F.Souvenirs(主席树)
- 如何学习SpringCloud?(SpringCloud模板)
- 做数据挖掘,就算发 20 几分的 CNS 子刊,也是垃圾!?--转载
- 开发中清除css加载的缓存使用
- CentOS 7安装Hadoop 3.0.0
- oracle错误分析:ora-04063:view view_test has errors
- SaltStack远程执行
- 使用实例 ---- 使用NUnit在.Net编程中进行单元测试
- cdr X6 64位32位缩略图补丁包
- 习题-第7章Web自动化测试
热门文章
- springmvc mybatis 分页插件 pagehelper
- 飘逸的python - 实现一个极简的优先队列
- iOS 运行时添加属性和方法
- java调用c++ dll出现中文乱码
- 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(二)
- multiple web application host under the same website on IIS (authentication mode)
- ssdb底层实现——ssdb底层是leveldb,leveldb根本上是skiplist(例如为存储多个list items,必然有多个item key,而非暴力string cat),用它来做redis的list和set等,势必在数据结构和算法层面上有诸多不适
- 【POJ 2442】 Sequence
- poj 2288 Islands and Bridges ——状压DP
- C语言程序读写文件(文件内存一个十进制数,每读一次数值加一)