题意
给你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; }