题解 CF15E Triangles
Tenderfoot · · 题解
我们先观察小三角形
从顶点 A 出发并回到顶点 A,有以下逆时针路径:
-
A\rightarrow B\rightarrow C -
A\rightarrow D\rightarrow F\rightarrow A -
A\rightarrow B\rightarrow E\rightarrow C\rightarrow A -
A\rightarrow D\rightarrow E\rightarrow C\rightarrow A -
A\rightarrow B\rightarrow E\rightarrow F\rightarrow A
共
我们令
- 从边下到底再从中间上来,如方案
2,4 所述。则此时逆时针路径的贡献为Ans 。 - 从中间下去,从边上回来,如方案
2,5 所述。此时逆时针路径的贡献为Ans 。 - 从边上下去,从边上返回。如方案
2 所述。此时逆时针路径贡献为Ans 。
对于情况
观察题目中所给的图形,因为不能经过黑色区域,所以对于第
以此类推,经过
最后加上返回操作。其情况类似于上面的分类讨论,不过多叙述。我们有总方案数
代码
#include<bits/stdc++.h>
#define Mod 1000000009
#define int long long
#define MAXN 1000010
#define Enter puts("")
#define Space putchar(' ')
#define Test_Begin Enter , puts("Test--------------")
#define Test_End Enter , puts("--------------------")
using namespace std;
constexpr int INF = 2147483647;
static inline int Read()
{
int Ans = 0;
char Ch = getchar(), Las = ' ';
while (!isdigit(Ch))
{
if (Ch == '-')
Las = '-';
Ch = getchar();
}
while (isdigit(Ch))
{
Ans = Ans * 10 + Ch - '0';
Ch = getchar();
}
if (Las == '-')
Ans = -Ans;
return Ans;
}
static inline void Write(int x)
{
if (x < 0)
{
x = -x;
putchar('-');
}
if (x >= 10)
Write(x / 10);
putchar(x % 10 + '0');
}
int Res[MAXN] , Pow[MAXN];
int Ans;
signed main()
{
int n = Read();
n >>= 1;
Res[1] = Pow[0] = 1;
for(register int i = 1; i <= n; i++)
Pow[i] = Pow[i - 1] * 2 % Mod;
for(register int i = 2; i <= n; i++)
Res[i] = Res[i - 1] * (Pow[i] - 3) % Mod;
for(register int i = 2; i <= n; i++)
Ans = (Ans + 4 * Res[i]) % Mod;
int _Ans(10 + 8 * Ans % Mod + 2 * Ans * Ans % Mod);
Write(_Ans % Mod);
return 0;
}