1 条题解
-
1
幽默,普及 T2 ,绿题。
幽默,比赛讲评,抽象做法。
幽默,
364B
代码,赛时通过率 。
题目很简单,就不解释了。
在下文中,设初始输入的数为 ,则我们令 。将 和 分别分解质因数,得 $n=p_1^{q_1}\times p_2^{q_2}\times\dots\times p_k^{q_k},b=r_1^{s_1}\times r_2^{s_2}\times\dots\times r_l^{s_l}$。那么,这意味着,我们使 乘到 ,就需要将 分解成若干个数相乘的形式,然后让 依次乘它们。
那么考虑贪心,为了使得从 变成 的次数最小,每次乘的数需要尽量大,而且必须同时是 的因数和 的因数,因为如果该数不是 的因数,那么乘出来的数显然永远不可能变成 ;如果该数不是 的因数,显然就无法进行该次操作。
那么,既为 的因数又为 的因数的数里面最大的一个,显然是 。所以最优的策略就是每次让 $n \gets n \times \gcd(n,b),b \gets \frac{b}{\gcd(n,b)}$。于是我们这样循环往复操作就可以了。注意:如果在乘的过程中出现了 = 1,那么显然无解,因为这样就进入了死循环,永远都不能到达 了。
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { int t; cin >> t; while(t--) { ll n,m; cin >> n >> m; bool flag = 0; ll bei = m / n, cnt = 0; while(n != m) { ll g = __gcd(bei,n); if(g == 1) { flag = true; break; } n *= g; bei /= g; cnt++; } cout << (flag ? -1 : cnt) << endl; } return 0; }
- 1
信息
- ID
- 66
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 626
- 已通过
- 181
- 上传者