专栏文章
题解:P13016 [GESP202506 六级] 最大因数
P13016题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mip0fb8i
- 此快照首次捕获于
- 2025/12/03 04:07 3 个月前
- 此快照最后确认于
- 2025/12/03 04:07 3 个月前
题目传送门
思路
设 质因数分解后的 (从小到大排,可重复),那么根据整数的唯一分解定理,显然它的第 级祖先为 。那就好做了,先给 和 质因数分解,存到
mp[0] 和 mp[1] 里面,计算交集 s,想算 LCA 那么只需要计算交集里最大的下标 使得 mp[0][s[id]] 和 mp[1][s[id]] 不相等即可。答案就是 ,时间复杂度 , 是 map 贡献的。Code
CPP#include <bits/stdc++.h>
using namespace std;
#define il inline
#define fst first
#define sed second
#define ins insert
#define cl clear
map<int, int> mp[2];
set<int> s;
il void qwq(int x, int id)
{
for(int i = 2;i <= x / i;++i)
{
while(x % i == 0)
{
mp[id][i]++;
s.ins(i);
x /= i;
}
}
if(x > 1)
{
mp[id][x]++;
s.ins(x);
}
}
int main()
{
int q;cin >> q;
while(q--)
{
s.cl(), mp[0].cl(), mp[1].cl();
int x, y;cin >> x >> y;
if(x == y)
{
cout << "0\n";
continue;
}
qwq(x, 0);qwq(y, 1);
int cnt = 0, id = 0;
for(auto i : s)
if(mp[0][i] != mp[1][i]) id = i;
for(auto i : s)
{
if(i > id) break;
if(i == id) cnt += abs(mp[0][i] - mp[1][i]);
else cnt += mp[0][i] + mp[1][i];
}
cout << cnt << "\n";
}
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...