题目描述
在长沙城新建的环城公路上一共有 8 个公交站,分别为 A、B、C、D、E、F、G、H。公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另外一个公交站往往要换几次车,例如从公交站 A 到公交站 D,你就至少需要换 3 次车。
Tiger 的方向感极其糟糕,我们知道从公交站 A 到公交 E 只需要换 4 次车就可以到达,可是 tiger 却总共换了 n 次车,注意 tiger 一旦到达公交站 E,他不会愚蠢到再去换车。现在希望你计算一下 tiger 有多少种可能的乘车方案。
输入格式
仅有一个正整数 n,表示 tiger 从公交车站 A 到公交车站 E 共换了 n 次车。
输出格式
输出一个正整数表示方案数,由于方案数很大,请输出方案数除以 1000 后的余数。
输入输出样例
输入 #1复制
6
输出 #1复制
8
说明/提示
8 条路线分别是:
(A→B→C→D→C→D→E),(A→B→C→B→C→D→E),
(A→B→A→B→C→D→E),(A→H→A→B→C→D→E),
(A→H→G→F→G→F→E),(A→H→G→H→G→F→E),
(A→H→A→H→G→F→E),(A→B→A→H→G→F→E)。
数据范围
4≤n≤10^7。
first,通过dp或超强的找规律方法,得到递推式
f[i] = f[i] * 4 - f[i-1] * 2;
then,设矩阵 a b
c d
前五项 0 2 8 28 96
得到 2a+8b=8
2c+8d=28
8a+28b=28
8c+28d=96
解得矩阵为
0 1
-2 4
then ,求其k>>=1项
欧克
#include<bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
#define endl '\n'
#define lowbit(x) ((x)&-(x))
const int mod=1e3;
typedef long long ll;
ll ans=0,n1,m1;
ll t=0,s1=0,s2=0,s3=0,s4=0,max1=0,max2=0,w,min1=100000000,sum=0,n,m,i,j,k,v,l,r;
inline int read() {
bool sym=0;
int res=0;
char ch=getchar();
while(!isdigit(ch))sym |=(ch =='-'),ch=getchar();
while(isdigit(ch)) res =(res<<3)+(res<<1)+(ch^48),ch=getchar();
return sym ? -res : res;
}
void print(int x) {
if(!x)return;
print(x/10);
putchar(x%10+'0');
}
int isPrime(int n) {
float n_sqrt;
if(n==1) return 0;
if(n==2 || n==3) return 1;
if(n%6!=1 && n%6!=5) return 0;
n_sqrt=floor(sqrt((float)n));
for(int i=5; i<=n_sqrt; i+=6) {
if(n%(i)==0 | n%(i+2)==0) return 0;
}
return 1;
}
ll a[107]={0,0,2,8,28};
//矩阵快速幂
struct mm {
ll m[107][108];
} as,ass;
mm operator *(const mm&a,const mm&b ) {
mm c ;
memset(c.m ,0,sizeof c.m );
for(ll i=1; i<=n; i++) {
for(ll j=1; j<=n; j++) {
for(ll k=1; k<=n; k++) {
c.m [i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
}
}
}
return c;
}
mm qmm(mm a,ll k) {
mm ans;
memset(ans.m ,0,sizeof ans.m );
for(ll i=1; i<=n; i++)
ans.m [i][i]=1;
while(k) {
if(k&1)
ans=ans*a;
a=a*a;
k>>=1;
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>k;
k>>=1;
n=2;
as.m [1][1]=0;
as.m [1][2]=1;
as.m [2][1]=-2;
as.m [2][2]=4;
ass=qmm(as,k);
cout<<abs(ass.m [1][1]);
return 0;
}
//mio lover