CF 166e
题意
(图自 codeforces 166e)
给定一个 n ,从一个顶点出发,求经过 n 条棱后回到出发点的方案数(答案模
1
e
9
+
7
1e9 + 7
1e9+7)
分析
显然,当 n = = 1 时,答案为 0
那么当从一个点出发时(例如 A点)
第一步可以向外走出 3 个点
第二步这些点分两种情况(以到达 C 点为例)
- 再走一步回到 A 点(回到A点)
- 继续向外走(前往 D/B 点)
显然,我们只需维护当前步数能回到起始点 w 和不在起始点 v 的方案数即可
由上述例子,可见关系式
wi = vi-1 * 3
vi = vi-1 * 2 + wi-1
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int Mod = 1e9 + 7;
signed main()
{
int n;
scanf("%lld" , &n);
int in = 1;
int out = 0;
for(int i = 1 ; i <= n ; i++)
{
int a = ((out << 1) + out) % Mod;
int b = ((out << 1) + in) % Mod;
in = a;
out = b;
}
printf("%lld" , in);
return 0;
}