博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hdu-6253 2017CCPC-Final K.Knightmare 规律
阅读量:6229 次
发布时间:2019-06-21

本文共 1071 字,大约阅读时间需要 3 分钟。

题意:给你一个无限大的棋盘,一个象棋中的马,问你这个马,飞n步后,可能的位置有多少种?

题解:看到题,就想先打表试试,于是先写个暴力(枚举每个位置,是马就飞周围8个格子,注意不要在同个循环里把格子的标记涂成相同的数字)

         然后打出来是9 41 109 205 325 473 649 853

        对于这种增长不快的,我一般是先直接两项相减

        得到 32 68  96  120 148 176 204

        这时就看到,这个数列的增长越来越有趣? 后面都加的是28?

        于是对于n>=5,我们有 f[n]=f[n-1]+120+(n-5)*28 = f[n-1]+28*n-20

        这种递推式很明显的 解法 f[n]  = f[n-1]+28*n-20

                                                 f[n-1]= f[n-2]+28*(n-1)-20

                                                 f[5]=f[4]+28*(5)-20

        左右相加,再抵消.

        f[n]=28*(n+n-1+...+5)-20*(n-5+1)=f[4]+28*(n+5)*(n-4)/2-20*(n-4)=(14*(n+5)-20)*(n-4)+205 = (14*n+50)*(n-4)+205

1 #include
2 using namespace std; 3 typedef unsigned long long ll; 4 int main() 5 { 6 int caseCnt; 7 scanf("%d",&caseCnt); 8 for(int t=1;t<=caseCnt;++t) { 9 ll n;10 scanf("%llu",&n);11 ll ans;12 if(n==0) ans=1;13 else if(n==1) ans=9;14 else if(n==2) ans=41;15 else if(n==3) ans=109;16 else if(n==4) ans=205;17 else {18 ans=(14*n+50)*(n-4)+205;19 }20 printf("Case #%d: %llu\n",t,ans);21 }22 return 0;23 }

 

转载于:https://www.cnblogs.com/qywhy/p/9764540.html

你可能感兴趣的文章
ARouter解析三:URL跳转本地页面源码分析
查看>>
git 常用操作
查看>>
iReport 中创建JavaBeanDataSource,用java类提供数据源给iReport
查看>>
大数据时代下的生活
查看>>
spring定时任务(方便轻巧)
查看>>
iOS的主要框架介绍
查看>>
spring源码阅读笔记(一)
查看>>
Selenium的简单安装和使用
查看>>
ios 滤镜
查看>>
linux系统学习第七天-<<工程师技术>>
查看>>
android中利用socket上传文件
查看>>
使用scrapy的定制爬虫-第二章-概
查看>>
【转】常见Java面试题
查看>>
数据库无法创建函数
查看>>
Shell字符串比较
查看>>
python3中二维List数据的三种处理方法及比较
查看>>
chrame 谷歌浏览器 a标签不能获得焦点 解决办法
查看>>
Java专家系列:CPU Cache与高性能编程
查看>>
Curl函数学习
查看>>
nginx
查看>>