题意
给你n组数,每组数一个a一个b。
我们可以对a或b进行两种操作,使他们最后相等。
第一种操作:
第二种操作:
如果最终没法使两个数相等的话,就输出负-1,如果可以使两个数相等的话输出使用操作的最少次数。
思路
我们可以把a,b都转换成这种形式

根据这两个公式我们可以发现,如果要想a和b相等,就必须让,,.
我们根据上面两个操作可以改变3的幂次和5的幂次,但是无法对x和y进行更改,所以如果x和y不相等的话就没法让a和b相等。
如果x和y相等的话,我们再进一步讨论。
根据第二个操作我们可以看出来,我们可以让5的幂次减少1,让3的幂次增加1.
我们需要先处理5的幂次,让5的幂次先相等。
怎么让5的幂次相等呢,我们肯定是对n,和p中比较大的数中来进行第二种操作,直到和另一个小的相等才行。
所以进行的操作数也就是是
假如的话
那我们就需要让a进行种操作2,然后m就会加上abs(n-q),然后再判断3的幂次,这样就可以很轻松的解决了。
代码

```#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
int main()
{
    int n;
    cin>>n;
    ll ans=0;
    bool flag=true;
    while(n--)
    {
        int a,b;
        cin>>a>>b;
        int cnta=0;
        int cntb=0;
        while(a%5==0)
        {
            a/=5;
            a*=3;
            cnta++;
        }
        while(b%5==0)
        {
            b/=5;
            b*=3;
            cntb++;
        }
        ans+=abs(cnta-cntb);
        cnta=0;
        cntb=0;
        while(a%3==0)
        {
            a/=3;
            cnta++;
        }
        while(b%3==0)
        {
            b/=3;
            cntb++;
        }
        ans+=abs(cntb-cnta);
        if(a!=b) flag=false;
    }
    if(flag) cout<<ans<<endl;
    else cout<<"-1"<<endl;
    return 0;
}