2161. 围攻

(File IO): input:siege.in output:siege.out

时间限制: 1000 ms  空间限制: 262144 KB  具体限制  

Goto ProblemSet

题目描述

经过刘邦的严密缉查,项羽的位置也就水落石出了。刘邦便趁机集合军队,进行对项羽的围攻。为了增加胜率,张良研究出一种全新的战法,目的就是一举打败难缠的项羽。
  这种军队共有N个单位,一个接着一个排成一排,每个单位可以是士兵,或者是战车,这样的组合可以爆发出意想不到的强大战斗力;但有一点,两辆战车不能相邻,否则会发生剐蹭等不好的事故。刘邦希望知道这N个单位的军队都多少种不同的排列方法,以便在战场中随机应变。两种军队的排列方法是不同的,当且仅当某一个单位对应不同,如:第i位这种是士兵,那种是战车……

输入

输入仅一行,一个整数N。

输出

输出仅一行,一个整数,表示排列的方案数。
 答案对 10^8+7 取模

样例输入

  1. 3

样例输出

  1. 5

数据范围限制

对于30%的数据:N≤15;
  对于70%的数据:N≤10^6;
  对于100%的数据:N≤10^18。

提示

样例解释

以0表示士兵,1表示战车,则全部方案如下:000,100,010,001,101。

Solution

这道题是什么题?组合?数列?暴力枚举?搜索剪枝?

先打个表压压惊……

Algorithm1

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<map>
  7. #include<set>
  8. #include<queue>
  9. #include<vector>
  10. #define IL inline
  11. #define re register
  12. using namespace std;
  13.  
  14. long long n,ans;
  15. IL void dfs(int depth,bool last)
  16. {
  17. if(depth>=n) {
  18. ans++;
  19. return;
  20. }
  21. if(!last) dfs(depth+,);
  22. dfs(depth+,);
  23. }
  24. int main()
  25. {
  26. // freopen("siege.in","r",stdin);
  27. // freopen("siege_table.out","w",stdout);
  28. for(n=;n<=;n++)
  29. {
  30. cout<<"n="<<n<<endl;
  31. ans=;
  32. dfs(,);
  33. cout<<ans<<endl;
  34. }
  35. return ;
  36. }

table

打表找规律,暴力出奇迹

  1. n=
  2.  
  3. n=
  4.  
  5. n=
  6.  
  7. n=
  8.  
  9. n=
  10.  
  11. n=
  12.  
  13. n=
  14.  
  15. n=
  16.  
  17. n=
  18.  
  19. n=
  20.  
  21. n=
  22.  
  23. n=
  24.  
  25. n=
  26.  
  27. n=
  28.  
  29. n=
  30.  
  31. n=
  32.  
  33. n=
  34.  
  35. n=
  36.  
  37. n=
  38.  
  39. n=
  40.  
  41. n=
  42.  
  43. n=
  44.  
  45. n=
  46.  
  47. n=
  48.  
  49. n=
  50.  
  51. n=
  52.  
  53. n=
  54.  
  55. n=
  56.  
  57. n=
  58.  
  59. n=
  60.  
  61. n=
  62.  
  63. n=
  64.  
  65. n=
  66.  
  67. n=
  68.  
  69. n=
  70.  
  71. n=
  72.  
  73. n=
  74.  
  75. n=
  76.  
  77. n=
  78.  
  79. //速度太慢了,后略……

好了,规律已找到,就是从2:1开始的斐波那契数列嘛

(然而我并没有看到取模,于是在打完表后我就去写高精度了)

证明呢?

别问我……下午听完讲后再证明吧……

Algorithm2

当然是:

暴力递推,边算边取模!

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<map>
  7. #include<set>
  8. #include<queue>
  9. #include<vector>
  10. #define IL inline
  11. #define re register
  12. using namespace std;
  13.  
  14. int main()
  15. {
  16. // freopen("siege.in","r",stdin);
  17. // freopen("siege.out","w",stdout);
  18. re unsigned int n,x=,y=,t,mo=1e8+;
  19. cin>>n;
  20. while(--n)
  21. {
  22. t=x;
  23. x=x+y;
  24. y=t;
  25. while(x>=mo)
  26. x-=mo;
  27. }
  28. printf("%d",x);
  29. return ;
  30. }

经过我多次实验,

while+减法比%要快一倍

register+局部变量比无register的全局变量也要快一点点

每次只需要让x取模

y和t也会变小

以及

这还是拿不到100分!

Algorithm3

好吧……我之前在洛谷上做过这道题的算法版(只是没有这些背景)

然而,我忘记了……

洛谷P1962 斐波那契数列

对于100%的数据,n<=10^18,一些公式可以利用

公式一

f(2n)=f(n)^2-f(n-1)^2=(2f(n-1)+f(n))*f(n)

公式二

f(2n+1)=f(n+1)^2+f(n)^2

证明

下午再说……

这样的话,只要对n进行二进制运算就可以了O(log(n))

顺便加一个数组存已经计算好的斐波那契数,方便以后调用

(不过10^18貌似存不下,考虑使用map)

Code3

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<map>
  7. #include<set>
  8. #include<queue>
  9. #include<vector>
  10. #define IL inline
  11. #define re register
  12. using namespace std;
  13. map<int,int>fbnq;
  14. long long mo=1e8+;
  15. IL long long f(long long num)
  16. {
  17. if(num==) return ;
  18. if(num==) return ;
  19. if(num==) return ;
  20. if(fbnq.find(num)!=fbnq.end()) return fbnq[num];
  21. long long ans=,n=num>>;
  22. if(num&)
  23. {
  24. ans=f(n+)*f(n+)%mo;
  25. ans+=f(n)*f(n)%mo;
  26. }
  27. else
  28. {
  29. ans=*(f(n-))%mo+f(n);
  30. ans%=mo;
  31. ans*=f(n);
  32.  
  33. }
  34. ans%=mo;
  35. fbnq[num]=ans;
  36. return ans;
  37. }
  38. int main()
  39. {
  40. // freopen("siege.in","r",stdin);
  41. // freopen("siege.out","w",stdout);
  42. long long n;
  43. cin>>n;
  44. printf("%lld",f(n+));
  45. return ;
  46. }

Attention

最好都开long long以防还没取模就溢出了!

还有许多细节可以优化

但是我饿了

纪中2019-08-23 12:32:06

哎……

纪中23日c组T3 2161. 【2017.7.11普及】围攻 斐波那契数列的更多相关文章

  1. 纪中23日c组T2 2159. 【2017.7.11普及】max 洛谷P1249 最大乘积

    纪中2159. max 洛谷P1249 最大乘积 说明:这两题基本完全相同,故放在一起写题解 纪中2159. max (File IO): input:max.in output:max.out 时间 ...

  2. Java算法求最大最小值,冒泡排序,斐波纳契数列一些经典算法<不断更新中>

    清明在家,无聊,把一些经典的算法总结了一下. 一.求最大,最小值 Scanner input=new Scanner(System.in); int[] a={21,31,4,2,766,345,2, ...

  3. 找斐波那契数列中的第N个数——递归与函数自调用算法

    题目描述 Description 用递归的方法求斐波那契数列中的第N个数 输入输出格式 Input/output 输入格式:一行,一个正整数n输出格式: 一行,一个数,表示斐波那契数列中的第N个数  ...

  4. 算法之路(三)----查找斐波纳契数列中第 N 个数

    算法题目 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: * 前2个数是 0 和 1 . * 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1 ...

  5. Python中斐波那契数列的赋值逻辑

    斐波那契数列 斐波那契数列又称费氏数列,是数学家Leonardoda Fibonacci发现的.指的是0.1.1.2.3.5.8.13.21.34.······这样的数列.即从0和1开始,第n项等于第 ...

  6. Python中斐波那契数列的四种写法

    在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,“你学过数据结构吗?”我略略点一点头 ...

  7. golang中通过递归或通道实现斐波那契数列

    1. 循环实现 package main import "fmt" func fibonacciFor(nums int) (s1 []int) { // 循环实现斐波那切数列 n ...

  8. 洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并

    洛谷P1880 石子合并 纪中2119. 环状石子归并 洛谷传送门 题目描述1 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石 ...

  9. 纪中18日c组模拟赛

    T2 GMOJ2127. 电子表格 (File IO): input:excel.in output:excel.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制   ...

随机推荐

  1. 暑假第七周总结(安装MongoDB和Tomcat以及MongoDB进行编程实践)

    本周主要对MongoDB和Tomcat进行了安装,两项安装都遇到了一些问题.其中在对MongoDB安装过程中出现了什么没有秘钥安全证书的,最终找了一堆教程重复了好多遍之后安装成功,虽然在启动和关闭的时 ...

  2. ROS机器人话题之自定义消息

    ROS提供了丰富的内建消息,std_msgs包定义了一些基本的类型. 具体例子 首先定义一个消息类型的文件叫做Complex 例Complex.msg float32 real float32 ima ...

  3. Python报错:PermissionError: [Errno 13] Permission denied

    问题分析: 错误产生的原因是文件无法打开,可能产生的原因是文件找不到,或者被占用,或者无权限访问,或者打开的不是文件,而是一个目录. 问题解决: 1.检查对应路径下的文件是否存在,且被占用.如果文件不 ...

  4. vue初始化、数据处理、组件传参、路由传参、全局定义CSS与JS、组件生命周期

    目录 项目初始化 组件数据局部化处理 子组件 父组件 路由逻辑跳转 案例 组件传参 父传子 子组件 父组件 子传父 子组件 父组件 组件的生命周期钩子 路由传参 第一种 配置:router/index ...

  5. HDU 6274 Master of Sequence (暴力+下整除)

    题意 两个1e5的数组a,b,定义\(S(t)=\left \lfloor \frac{t-b_i}{a_i} \right \rfloor\),有三个操作 1 x y:将\(a[x]\)变为\(y\ ...

  6. XXE漏洞复现步骤

    XXE漏洞复现步骤 0X00XXE注入定义 XXE注入,即XML External Entity,XML外部实体注入.通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远 ...

  7. Jmeter之将测试结果导出到Excel

    一:环境准备 1.下载jxl.jar这个jar包 2.下载好之后,放到Jmeter的安装路径下的lib目录下 3.jxl.jar的作用:完成对Excel的读写以及修改操作 如何利用jmter操作exc ...

  8. java架构之路-(微服务专题)feign的基本使用和nacos的配置中心

    上次回归: 上次我们说了ribbon的基本使用,包括里面的内部算法,算法的细粒度配置,还有我们自己如何实现我们自己的算法,主要还是一些基本使用的知识,还不会使用ribbon的小伙伴可以回去看一下上一篇 ...

  9. 我一个二本大学是如何校招拿到阿里offer的

    作者:薛勤,互联网从业者,编程爱好者. 本文首发自公众号:代码艺术(ID:onblog)未经许可,不可转载 01:终于步入大学 我既没有跨过山和大海,也没有穿过人山人海,我就是我,一个普通本科大学生. ...

  10. 风物长宜放眼量,人间正道是沧桑 - 一位北美 IT 技术人破局

    引言 我对于本科时光的印象,还停留在那所普通 211 大学的建筑物之间,我坐在大学的时光长廊里,满眼望去,都是经历的过的故事.可毕业后回首,却很少有人能说,自己从来没有迷茫过.迷茫,仿佛就是一团乌云, ...