1 条题解
-
0
变形怪 题解
题意与关键信息
- 初始体型 , 种配方 。
- 每步:若 ,则 ;可以变形任意多次(含 次)。
- 求可达的不同体型数量(含初始体型)。
- 数据范围:,, 且两两不同。
从暴力到正解
暴力搜索(,30 分)
DFS 枚举全部可达体型,用集合去重:
void dfs(ll v) { seen.insert(v); for (ll xi : x) if (v % xi == 0) dfs(v / xi); }很小时状态数有限,可直接通过。 一大(如 )状态可能爆炸?——并不会爆炸,见下。
特殊性质( 两两互质且 、,10 分)
记 的质因数分解。因为 两两互质且每个 恰整除 一次(),每个配方一旦使用就会把 中对应的那部分因子恰好除尽一次,之后该配方永远无法再用( 不再含 的任何因子)。
于是每种配方只有"用 / 不用"两种选择,且互不干扰,答案恰为:
正解:BFS 去重
能变到 当且仅当 。因为每一步都保持"整除",所有可达体型都是 的约数。 时约数个数最多约 个,因此 BFS 状态数有限且很小:
unordered_set<ll> seen; queue<ll> q; seen.insert(n); q.push(n); while (!q.empty()) { ll v = q.front(); q.pop(); for (ll xi : x) if (v % xi == 0 && seen.insert(v / xi).second) q.push(v / xi); } cout << seen.size();复杂度
- 每个状态做 次取模/除法, 哈希判重。
- 状态数 的约数个数 ,故 ,空间 。
易错点
long long: 可达 ,必须用 64 位整数。- 时不可再变:,BFS 不会从 继续扩展,天然终止。
- 答案包含初始体型: 本身也要计数(入队前先
insert(n))。 - 配方可能永远用不上: 时该配方无效(例如 是质数时答案恒为 ),BFS 自然处理,无需特判。
参考代码
见
summercspj262B.cpp。
- 1
信息
- ID
- 255
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 56
- 已通过
- 12
- 上传者