给出n个数,允许的操作是对这些数扩大为原来的2倍或3倍 ,次数不限
乍一看以为是什么难题,直接求b个数求了一次gcd,然后每个数除去gcd。之后再让每个数一直除2 3,直到不能除,那么最后如果全部数都是1 那么答案 就是YES,否则,必然无法使得全部数最后一样,这样就ac了。。。。
最后发现 连gcd都不用求,直接对每一个数不断除2和3,
最后如果全部数相等 ,就是 yes,否则NO
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define inf 2147483647
int tm[100005];
int gcd(int a,int b)
{
int r;
while(b>0)
{
r=a%b;
a=b;
b=r;
}
return a;
}
int main()
{
int n,i,j,tt,m;
scanf("%d",&n);
scanf("%d",&tm[1]);
// int gd=tm[1];
for (i=2;i<=n;i++)
{
scanf("%d",&tm[i]);
// gd=gcd(gd,tm[i]);
}
// for (i=1;i<=n;i++)
// tm[i]/=gd;
int flag=0;
while(tm[1]%2==0)
tm[1]/=2;
while(tm[1]%3==0)
tm[1]/=3;
int gd=tm[1];
for (i=1;i<=n;i++)
{
while(tm[i]%2==0)
tm[i]/=2;
while(tm[i]%3==0)
tm[i]/=3;
if (tm[i]==tm[1]) continue;
else
{
flag=1;
break;
}
}
if (flag)
printf("NO\n");
else
printf("YES\n");
return 0;
}