惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Vercel News
Vercel News
C
Check Point Blog
G
Google Developers Blog
博客园 - 司徒正美
量子位
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
A
About on SuperTechFans
美团技术团队
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
Y
Y Combinator Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Cloudflare Blog
U
Unit 42

博客园 - kaikai

visual studio生成后调试启动又提示部分项目需要生成问题总结 让vc2010的项目在vc2012也能直接使用,而不必修改PlatformToolSet TFS:添加已经在项目中但不在TFS中的文件 宅电脑桌 动作游戏自定义技能探讨 TFS如何跨分支合并未签入的文件 友元接口-限制你的友元类数量 g++上c++模板与padding交互产生的陷阱 卡马克的求平方根函数代码的陷阱 [zt]调试的时候,无法设置数据断点(为灰色) [zt]关闭VS自带的提示 vs偶尔出现链接时间过长的情况的临时处理方法 vs链接小知识,/LTCG 这是一场正义的战争,伟大而又激烈! 浮点数默认精度在windows/linux上的差异 数独求解程序 阿朱~你走好 短代码.第几天 短代码.求2点之距离
短代码.EOF串
kaikai · 2007-07-19 · via 博客园 - kaikai

一个只包含EOF三个字符的字符串,并且不存在连续的O,问长度为n的这种串有多少种。
其中0<n<40。

递推: e'=e+o+f, o' =e+f, f'=e+o+f

// 预处理查表
main(i,n){__int64 d[39]={1,1,1,3};for(;i<39;i++)d[i][1]=d[i-1][0]+d[i-1][2],d[i][2]=d[i][0]=d[i][1]+d[i-1][1],d[i][3]=d[i][1]+d[i][0]*2;while(~scanf("%d",&n))printf("%I64d\n",d[n][3]);}
// 把eof分开存,去掉二级数组的括号
main(i,n){__int64 e[39]={1},o[39]={1},f[39]={1},s[39]={3};for(;i<39;i++)f[i]=e[i]=(o[i]=e[i-1]+f[i-1])+o[i-1],s[i]=o[i]+e[i]*2;while(~scanf("%d",&n))printf("%I64d\n",s[n-1]);}
// e,f总是一样的,于是去掉f
main(i,n){__int64 e[39]={1},o[39]={1},s[39]={3};for(;i<39;i++)e[i]=(o[i]=e[i-1]*2)+o[i-1],s[i]=o[i]+e[i]*2;while(~scanf("%d",&n))printf("%I64d\n",s[n-1]);}
// 与其保存总和,不如结果时计算一下
main(i,n){__int64 e[39]={1},o[39]={1};for(;i<39;i++)e[i]=(o[i]=e[i-1]*2)+o[i-1];while(~scanf("%d",&n))printf("%I64d\n",o[n-1]+e[n-1]*2);}
// 不再查表,按需计算
main(i,n){__int64 e,o,t;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(i=e=o=1;i<n;i++)t=o,e=(o=e+e)+t;}
// 调整一下递推式
main(n){__int64 e,o,t;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(e=o=1;--n;e=(o=e+e)+t)t=o;}
// 再调整递推式,去掉临时变量
main(n){__int64 e,o;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(e=o=1;--n;o=e-o)e+=e+o;}
// 多一次循环,结果就是e
main(n){__int64 e,o;for(;~scanf("%d",&n);printf("%I64d\n",e))for(e=o=1;n--;o=e-o)e+=e+o;}

农夫三拳,这下你还能更短吗。嘿嘿嘿:)