2161. 围攻

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

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

Goto ProblemSet

题目描述

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

输入

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

输出

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

样例输入

3

样例输出

5

数据范围限制

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

提示

样例解释

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

Solution

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

先打个表压压惊……

Algorithm1

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define IL inline
#define re register
using namespace std; long long n,ans;
IL void dfs(int depth,bool last)
{
if(depth>=n) {
ans++;
return;
}
if(!last) dfs(depth+,);
dfs(depth+,);
}
int main()
{
// freopen("siege.in","r",stdin);
// freopen("siege_table.out","w",stdout);
for(n=;n<=;n++)
{
cout<<"n="<<n<<endl;
ans=;
dfs(,);
cout<<ans<<endl;
}
return ;
}

table

打表找规律,暴力出奇迹

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

n=

//速度太慢了,后略……

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

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

证明呢?

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

Algorithm2

当然是:

暴力递推,边算边取模!

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define IL inline
#define re register
using namespace std; int main()
{
// freopen("siege.in","r",stdin);
// freopen("siege.out","w",stdout);
re unsigned int n,x=,y=,t,mo=1e8+;
cin>>n;
while(--n)
{
t=x;
x=x+y;
y=t;
while(x>=mo)
x-=mo;
}
printf("%d",x);
return ;
}

经过我多次实验,

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

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define IL inline
#define re register
using namespace std;
map<int,int>fbnq;
long long mo=1e8+;
IL long long f(long long num)
{
if(num==) return ;
if(num==) return ;
if(num==) return ;
if(fbnq.find(num)!=fbnq.end()) return fbnq[num];
long long ans=,n=num>>;
if(num&)
{
ans=f(n+)*f(n+)%mo;
ans+=f(n)*f(n)%mo;
}
else
{
ans=*(f(n-))%mo+f(n);
ans%=mo;
ans*=f(n); }
ans%=mo;
fbnq[num]=ans;
return ans;
}
int main()
{
// freopen("siege.in","r",stdin);
// freopen("siege.out","w",stdout);
long long n;
cin>>n;
printf("%lld",f(n+));
return ;
}

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. 乌班图14更新软件提示错误:https://mirrors.aliyun.com kubernetes-xenial InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY 6A030B21BA07F4FB

    提示如下 获取: https://mirrors.aliyun.com kubernetes-xenial InRelease 忽略 https://mirrors.aliyun.com kubern ...

  2. Vue methods,watch,computed的区别

    1. computed(计算属性) 计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算.注意,如果某个依赖 (比如非响应式属性) 在该实例范畴之外,则计算属性是不会被更新的. eg: < ...

  3. VC运行时库/MD、/MDd、/MT、/MTd说明

    http://blog.csdn.net/holybin/article/details/26134153 VC运行时库设置:VC项目属性->配置属性->C/C++->代码生成-&g ...

  4. HDU_1556_线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=1556 直接用了技巧来做. #include<iostream> #include<cstdio ...

  5. POJ_2479_DP

    http://poj.org/problem?id=2479 从前向后保存起点到每一点的最长串,从后向前保存尾点到每一点的最长串. 然后枚举中断点,找前后和最大值就行了. #include<io ...

  6. 使用logstash结合logback收集微服务日志

    因为公司开发环境没有装elk,所以每次查看各个微服务的日志只能使用如下命令 这样子访问日志是并不方便,于是想为每个微服务的日志都用logstash收集到一个文件out中,那以后只要输出这个文件则可查看 ...

  7. Spring Boot2 系列教程(三十二)Spring Boot 整合 Shiro

    在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro. 今天松哥就来和大家聊聊 Spring Boot ...

  8. Mac设置Linux免密登陆

    利用公钥认证登录 1.创建共钥 输入下面的命令,一路回车 ssh-keygen -t rsa 2.复制公钥到ssh服务器 将上一步生成的id_rsa.pub公钥文件复制到目标服务器对应用户下的~/.s ...

  9. 基于原生的 html css js php ajax做的一个 web登录和注册系统

    完整代码下载: 百度网盘地址 https://pan.baidu.com/s/1D1gqHSyjgfoOtYCZm7ofJg 提取码 :nf0b 永久有效 注意: 1 如果要正常运行此示例, 本地需要 ...

  10. Shell脚本 硬盘监控

    用shell 写了一个硬盘监控的小程序   #!/bin/bash MAX=95 EMAIL=zonghua@iyunshu.com PART=sda1   IP=`ifconfig |grep -w ...