Description
如图为一个高度为
n=12
的区域,问从最高点
H
出发最终回到
Input
一个偶数
n
表示区域的高度
Output
输出满足条件的路线数量,结果模 109+9
Sample Input
2
Sample Output
10
Solution
由于路线无交,所以一个路线唯一对应一个连续的白色区域(连续表示每一个白色块都会与另一个白色块共边)
由于左右对称,先考虑选取最上边两个白色块后从左边选取连续的白色区域方案数 ans ,则答案为 2⋅(ans2+1) ,表示左边可以选取任意连续白色区域与右边选取任意白色区域通过最上边两个白色块都可以连起来构成一个合法方案,再加上只经过最上边一个白色块的方案,再考虑左右的先后顺序所以要乘 2
从上到下给区域定义为第
由于第
3
层和第
进而 ans=6+4⋅∑i=3n2∏j=2i−1dp[j−1]
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100001;
#define mod 1000000009
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==2)printf("10\n");
else
{
int ans=6,p=2,res=1,sum=4;
for(int i=3;i<=n/2;i++)
{
p+=p;
if(p>=mod)p-=mod;
res+=p;
if(res>=mod)res-=mod;
sum=(ll)sum*res%mod;
ans+=sum;
if(ans>=mod)ans-=mod;
}
ans=((ll)ans*ans+1)%mod;
ans+=ans;
if(ans>=mod)ans-=mod;
printf("%d\n",ans);
}
}
return 0;
}