AtCoder Beginner Contest 306 G Return to 1

洛谷传送门

AtCoder 传送门

考虑若干个能被 1 到达且能到达 1 的环,设它们的环长分别为 a1,a2,...,ak

那么我们现在要每个环走若干遍,使得步数不含除 25 以外的质因子。

设第 i 个环走 xi 遍,那么其实就是要求 i=1kaixi=1010100

根据裴蜀定理,要求 gcd(a1,a2,...,ak) 不含除 25 以外的质因子。

于是问题转化成求所有环长。

考虑 dfs 树,每一条非树边都对应一个环,找非树边即可。

时间复杂度 O(nlogn),瓶颈在求 gcd

加强版是 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;
}
posted @   zltzlt  阅读(169)  评论(8编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示