AtCoder Beginner Contest 306 G Return to 1
考虑若干个能被 到达且能到达 的环,设它们的环长分别为 。
那么我们现在要每个环走若干遍,使得步数不含除 或 以外的质因子。
设第 个环走 遍,那么其实就是要求 。
根据裴蜀定理,要求 不含除 或 以外的质因子。
于是问题转化成求所有环长。
考虑 dfs 树,每一条非树边都对应一个环,找非树边即可。
时间复杂度 ,瓶颈在求 。
加强版是 CF1515G Phoenix and Odometers。
code
// Problem: G - Return to 1 // Contest: AtCoder - Toyota Programming Contest 2023#3(AtCoder Beginner Contest 306) // URL: https://atcoder.jp/contests/abc306/tasks/abc306_g // Memory Limit: 1024 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org) #include <bits/stdc++.h> #define pb emplace_back #define fst first #define scd second #define mems(a, x) memset((a), (x), sizeof(a)) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef long double ldb; typedef pair<ll, ll> pii; const int maxn = 200100; int n, m, d[maxn], g; bool vis[maxn], mk[maxn]; vector<int> G[maxn], T[maxn]; void dfs(int u) { mk[u] = 1; for (int v : T[u]) { if (!mk[v]) { dfs(v); } } } void dfs2(int u) { vis[u] = 1; for (int v : G[u]) { if (!mk[v]) { continue; } if (!vis[v]) { d[v] = d[u] + 1; dfs2(v); } else { int t = abs(d[u] + 1 - d[v]); g = __gcd(g, t); } } } void solve() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) { vector<int>().swap(G[i]); vector<int>().swap(T[i]); d[i] = 0; vis[i] = mk[i] = 0; } while (m--) { int u, v; scanf("%d%d", &u, &v); G[u].pb(v); T[v].pb(u); } g = 0; dfs(1); dfs2(1); if (!g) { puts("No"); return; } while (g % 2 == 0) { g /= 2; } while (g % 5 == 0) { g /= 5; } puts(g == 1 ? "Yes" : "No"); } int main() { int T = 1; scanf("%d", &T); while (T--) { solve(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App