CodeForces 1737 E - Ela Goes Hiking 题解
Glacial_Shine · · 题解
更好的阅读体验。
思路
我们先将题目看成
首先我们知道,如果一个点初始方向是向右,那么他无论如何都不可能活到最后。
所以我们只需要考虑向左的情况。
我们可以求出它初始方向向左时活到最后的方案数,然后除于所有的方案,就是我们要求的概率了,接下来我们考虑如何求出活到最后的方案数。
我们可以将整个过程分为两部分,首先向左走到底,此时右边的无论如何变化都不会影响到当前左边的部分,然后再转向向右。
设当前点为
所以编号大于
再考虑右边的部分,我们设当前的方案数为
可以用前缀和优化到
然后将左边和右边的方案数乘起来,在除于所有的方案数,就是答案了。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MOD = 1e9 + 7;
int T, n;
LL f[3000005], g[3000005];
LL Pow(LL a, LL b) {
LL s = 1;
while (b) {
if (b & 1)
s = s * a % MOD;
a = a * a % MOD, b = b >> 1;
}
return s;
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
for (int i = 1; i <= 2 * n; i++)
f[i] = g[i] = 0;
f[n] = g[n] = 1;
for (int i = n - 1; i; i--)
f[i] = (g[i + 1] - g[i * 2] + MOD) % MOD, g[i] = (g[i + 1] + f[i]) % MOD;
for (int i = 1; i <= n; i++)
printf("%lld\n", f[i] * Pow(2, i / 2) % MOD * Pow(Pow(2, n - 1), MOD - 2) % MOD);
}
return 0;
}