题解:P13016 [GESP202506 六级] 最大因数
A7F3jK9pR0xf_ · · 题解
题目传送门
思路
设 mp[0] 和 mp[1] 里面,计算交集 s,想算 LCA 那么只需要计算交集里最大的下标 mp[0][s[id]] 和 mp[1][s[id]] 不相等即可。答案就是
Code
#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;
}