围攻

18 篇文章 0 订阅

项羽和刘邦大战(楚汉之争),然后就……

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

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

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

样例输入
3
样例输出
5
也就是说,士兵和士兵可以一起放,而战车不行咯。
求方法数,感觉可以用DP,数据也不大。那就开干啦。
f i , 0 f_{i,0} fi,0为,第i个位置放兵的方案数, f i , 1 f_{i,1} fi,1为,第i个位置放车的方案数。自然可得, f i , 0 = f i − 1 , 0 + f i − 1 , 1 f_{i,0}=f_{i-1,0}+f_{i-1,1} fi,0=fi1,0+fi1,1, f i , 1 = f i − 1 , 0 f_{i,1}=f_{i-1,0} fi,1=fi1,0
可能很多小伙伴发现有点熟悉呢,别急啊,继续看下去。

最终输出答案, f n , 0 + f n , 1 f_{n,0}+f_{n,1} fn,0+fn,1
然后自己随便出样例
n=1,2
n=2,3
n=3,5
n=4,8
n=5,13
……

啊这,不就是斐波那契嘛?
好似是的,再看看转移式,这就是斐波那契啊。
然后开开心心地重打代码,换斐波那契。
然后开开心心地RE 70,发现 对于100%的数据:N≤10^18。,我的……,啊啊啊。
这,还有啥方法吗?

这时TSY奆兴致冲冲地来告诉我:“我第三题A啦,register过啦”
然后加上register优化和周期优化就过啦,A了(我傻了,这register何方神圣啊)。
这里讲一下周期优化,发现,斐波那契数列在200000016个后面mod 10000007的数是一样的。所以可以大大缩短时间,但是不+register照样会超。
讲题的时候还知道有了矩阵乘法的方法,还要研究啊。

#include<bits/stdc++.h>
using namespace std;
const int mod=100000007;
long long n;
int main()
{
	freopen("siege.in","r",stdin);
	freopen("siege.out","w",stdout);
	scanf("%lld",&n),n--;
	n=n%200000016+1;
	if(n==1){printf("2");return 0;}
	if(n==2){printf("3");return 0;}
	register int a=2,b=3,c;
	for(register int i=3;i<=n;++i)
		c=a+b,a=b,b=c,a%=mod,b%=mod,c%=mod;
	printf("%d",c%mod);
	return 0;
}

这register何方神圣啊……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值