CF#318-C - Bear and Poker-大水题t

本文介绍了一种通过不断将输入的整数除以2或3直至不能再除的方法来判断这些整数是否能通过乘以2或3的操作变得相同。文章提供了一个简单的C++程序实现,该程序能够有效地解决这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出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;
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值