Limak is an old brown bear. He often plays poker with his friends. Today they went to a casino. There are n players (including Limak himself) and right now all of them have bids on the table. i-th of them has bid with size ai dollars.
Each player can double his bid any number of times and triple his bid any number of times. The casino has a great jackpot for making all bids equal. Is it possible that Limak and his friends will win a jackpot?
First line of input contains an integer n (2 ≤ n ≤ 105), the number of players.
The second line contains n integer numbers a1, a2, ..., an (1 ≤ ai ≤ 109) — the bids of players.
Print "Yes" (without the quotes) if players can make their bids become equal, or "No" otherwise.
4 75 150 75 50
Yes
3 100 150 250
No
因为任何一个整数都可以表示成 素因子的积。 所以x = 2^k1 * 3^k2 * 5^k3 * 7^k4
然后 这些数通过*2 *3最终的结果一样 所以等价于 每个数的k3,k4.....kn 都一样。 因为前面的2和3的幂次可以取得非常大。比如2^11111111111 * 3^1111111111。
所以希望 gcd(x,y) = 2^(min(kx1,ky1)) * 3^(min(kx2,ky2) * 5^k3 * 5^k4.
然后等价于x / gcd(x,y) 的因子只有2,3。
#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define mp push_back
int gcd(int a,int b)
{
return a==0?b:gcd(b%a,a);
}
int arr[100010];
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
int gg = 0;
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
gg = gcd(gg,arr[i]);
}
bool ok = true;
for(int i=0;i<n;i++)
{
arr[i] = arr[i] / gg;
while(arr[i] % 2 ==0) arr[i] /= 2;
while(arr[i] % 3 ==0) arr[i] /= 3;
if(arr[i] != 1)
{
ok = false;
break;
}
}
if(ok) printf("Yes\n");
else printf("No\n");
}
return 0;
}