项羽和刘邦大战(楚汉之争),然后就……
题目:
经过刘邦的严密缉查,项羽的位置也就水落石出了。刘邦便趁机集合军队,进行对项羽的围攻。为了增加胜率,张良研究出一种全新的战法,目的就是一举打败难缠的项羽。
这种军队共有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=fi−1,0+fi−1,1,
f
i
,
1
=
f
i
−
1
,
0
f_{i,1}=f_{i-1,0}
fi,1=fi−1,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何方神圣啊……