題意:
現在有n個人,每個人都持有a[i]這個價值的牌,並且每個人可以每次無限次數的使自己的牌擴大2倍,擴大3倍,然後問你是否可能使得最終所有人的牌的價值數變成一樣的。
思路:
很明顯,因為最後所有數都要相同的話,那麼只可能是和最大的那個數相同的,並且它只能由擴大2倍,3倍來得到,所以我們可以使所有的數都不停的除以2與3,直到不能除為止,然後判斷除完以後所有的數是否相同,如果相同,則說明是可以的,否則,則是不可以的。
#include#include #include #include #include using namespace std; #define eps 1e-8 #define inf 99999999 #define maxn 100010 typedef __int64 ll; ll a[maxn]; int main(){ int n; ll max1=-1; scanf(%d,&n); for(int i=1;i<=n;i++){ scanf(%I64d,&a[i]); } bool ff=false; for(int i=1;i<=n;i++){ ll res=a[i]; while(a[i]%2==0) a[i]=a[i]/2; while(a[i]%3==0) a[i]=a[i]/3; } ll res=a[1]; bool f1=false; for(int i=2;i<=n;i++){ if(res!=a[i]){ f1=true; break; } } if(f1) printf(No ); else printf(Yes ); } /* 2 6 18 */
一開始我想錯了,我想成如果它能被最大的數整除而且除數%2==0||%3==0,但是這樣是不對的,因為10,1,1,1的時候,10是由2與5所組成的,所以是不可以的。