P6803 [CEOI2020] 星际迷航 题解
观察这个从第
根据我们刚才的分析,现在需要考虑的是在第
- 若
原本先手必胜,则添加的 不能改变 现在的状态; - 否则必须改变
的状态。
那么
现在的目标是求出
为了方便一些,可以记
那么我们知道了
代码:
#include <bits/stdc++.h>
#define N 100005
#define int long long
#define mod 1000000007
using namespace std;
int n, d;
vector<int>v[N];
int h[N];
int w[N][2];
int g[N];
void dfs1(int x, int fa) {
for (auto y : v[x]) {
if (y == fa) continue;
dfs1(y, x);
h[x] += !h[y];
w[x][h[y] > 0] += g[y];
}
if (h[x] == 0) g[x] = w[x][1] + 1;
else if(h[x] == 1) g[x] = w[x][0];
else g[x] = 0;
}
int ct;
int dth, dtg, dtw[2];
void dfs2(int x, int fa) {
if (h[x] == 0) ++ct;
for (auto y : v[x]) {
if (y == fa) continue;
dtw[0] = w[x][0], dtw[1] = w[x][1];
dth = h[x] - !h[y];
dtw[h[y] > 0] -= g[y];
if (dth == 0) dtg = dtw[1] + 1;
else if(dth == 1) dtg = dtw[0];
else dtg = 0;
h[y] += !dth;
w[y][dth > 0] += dtg;
if (h[y] == 0) g[y] = w[y][1] + 1;
else if(h[y] == 1) g[y] = w[y][0];
else g[y] = 0;
dfs2(y, x);
}
}
struct Mar {
int a[2][2];
Mar() {
memset(a, 0, sizeof a);
}
};
void add(int &x, int y) {
x = ((x + y) % mod + mod) % mod;
}
Mar operator * (Mar &a, Mar &b) {
Mar res;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
add(res.a[i][j], a.a[i][k] * b.a[k][j] % mod);
return res;
}
Mar qpow(Mar x, int y) {
Mar ans;
ans.a[0][0] = ans.a[1][1] = 1;
while (y) {
if (y & 1) ans = ans * x;
x = x * x;
y >>= 1;
}
return ans;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> d;
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs1(1, 0);
dfs2(1, 0);
Mar res;
for (int i = 1; i <= n; i++) {
if (h[i]) {
add(res.a[0][0], g[i]);
add(res.a[0][1], n - g[i]);
add(res.a[1][1], n);
}
else {
add(res.a[0][0], n - g[i]);
add(res.a[0][1], g[i]);
add(res.a[1][0], n);
}
}
res = qpow(res, d - 1);
Mar ans;
ans.a[0][0] = ct, ans.a[0][1] = n - ct;
ans = ans * res;
if (h[1]) cout << (n * (ans.a[0][0] + ans.a[0][1]) % mod - g[1] * ans.a[0][0] % mod + mod) % mod << "\n";
else cout << g[1] * ans.a[0][0] % mod << "\n";
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现