structLCA { int n, lg; std::vector<std::vector<int>> up; std::vector<int> depth, tin, tout; int timer = 0; LCA(std::vector<std::vector<int>>& ed, int root = 0) { n = int(ed.size()); lg = std::__lg(n) + 1; up.assign(n, std::vector<int>(lg)); depth.assign(n, 0); tin.resize(n), tout.resize(n); auto dfs = [&](auto self, int u, int p) -> void { tin[u] = timer++; up[u][0] = p; for (int i = 1; i < lg; ++i) up[u][i] = up[up[u][i - 1]][i - 1]; for (int v : ed[u]) { if (v == p) continue; depth[v] = depth[u] + 1; self(self, v, u); } tout[u] = timer++; }; dfs(dfs, root, root); } boolis_ancestor(int u, int v){ return tin[u] <= tin[v] && tout[v] <= tout[u]; } intget_lca(int u, int v){ if (is_ancestor(u, v)) return u; if (is_ancestor(v, u)) return v; for (int i = lg - 1; i >= 0; --i) if (!is_ancestor(up[u][i], v)) u = up[u][i]; return up[u][0]; } std::vector<int> get_path(int u, int v){ int w = get_lca(u, v); std::vector<int> up_path, down_path; while (u != w) { up_path.push_back(u); u = up[u][0]; } up_path.push_back(w); while (v != w) { down_path.push_back(v); v = up[v][0]; } std::reverse(down_path.begin(), down_path.end()); up_path.insert(up_path.end(), down_path.begin(), down_path.end()); return up_path; } }; voidclearlove13(){ constexprint lg = 20; int n, q, rt; std::cin >> n >> q ; rt = 1; std::vector<std::vector<int>> g(n + 1); std::vector<int>ch(q); for (int i = 2; i <= n; i++) { int u; std::cin >> u; g[u].push_back(i); g[i].push_back(u); } std::vector<int> dep(n + 1); std::vector<std::array<int, lg>> up(n + 1); for (int i = 1; i <= n; i++) { std::fill(up[i].begin(), up[i].end(), -1); } auto dfs = [&](auto self, int u, int fa) -> void { up[u][0] = fa; for (int i = 1; i < lg; i++) { if (up[u][i - 1] != -1) { up[u][i] = up[up[u][i - 1]][i - 1]; } } for (int v : g[u]) { if (v != fa) { dep[v] = dep[u] + 1; self(self, v, u); } } }; dfs(dfs, rt, -1); auto lca = [&](i64 u, i64 v) -> int { if (dep[u] < dep[v]) std::swap(u, v); i64 d = dep[u] - dep[v]; for (int i = 0; i < lg; i++) { if (d >> i & 1) u = up[u][i]; } if (u == v) return u; for (int i = lg - 1; i >= 0; i--) { if (up[u][i] != up[v][i]) { u = up[u][i]; v = up[v][i]; } } return up[u][0]; }; auto dist = [&](i64 u, i64 v) -> int { i64 l = lca(u, v); return dep[u] + dep[v] - 2 * dep[l]; }; for (auto &i : ch) { std::cin >> i; } i64 ans = dist(1, ch[0]); for (int i = 1; i < q; i++) { ans += dist(ch[i - 1], ch[i]); } std::cout << ans << '\n'; }
intmain(){ int n; longlong k; cin >> n >> k; longlong res = 0; // f(1)=0(1个人时位置为0) for (int i = 2; i <= n; ++i) { res = (res + k) % i; // 递推计算f(i) } cout << res + 1 << endl; // 转换为1-based编号 return0; }
G. 探险者的补给路线
直接根据题目意思写就行,$x, y$ 分别是 $a, b$ 的倍数。
1 2 3 4 5 6 7 8 9 10
voidclearlove13(void) { i64 a, b, x, y; std::cin >> a >> b >> x >> y; if (x % a == 0 && y % b == 0 && x >= 0 && y >= 0) { std::cout << "YES\n"; } else { std::cout << "NO\n"; } }