2538 二三排列
2.0 秒 262,144.0 KB
给你 nn个正整数,请你将其重排,使得后一个数是前一个数的三分之一(整除)或二倍。
你只需判断是否有解,若有解,输出 Possible ,否则输出 Impossible 。
n<=106n<=106,所有数字 ≤1018≤1018 。
收起
输入
第一行一个数字 n 。
第二行 n 个数字。
输出
一行一个字符串。若有解,输出 Possible ,否则输出 Impossible 。
输入样例
3
3 1 2
输出样例
Possible
题解:题意让我们排序,我需要找一个排序规则,我们按照因子3的个数来降序排序,如果因子3个数相同,我们就按原来数来升序排序。
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
struct Node
{
LL a,b;
}p[1000000];
bool cmp(Node x,Node y)
{
if(x.b!=y.b)
return x.b>y.b;
return x.a<y.a;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>p[i].a;
for(int i=0;i<n;i++)
{
p[i].b=0;
LL sns=p[i].a;
while(sns%3==0)
{
p[i].b++;
sns/=3;
}
}
// for(int i=0;i<n;i++)
// cout<<p[i].a<<" "<<p[i].b<<endl;
// cout<<endl;
sort(p,p+n,cmp);
// for(int i=0;i<n;i++)
// cout<<p[i].a<<" "<<p[i].b<<endl;
// cout<<endl;
for(int i=0;i<n-1;i++)
{
if(p[i].a != p[i + 1].a * 3 && p[i].a != p[i + 1].a / 2)
{
// cout<<i<<" "<<p[i].a<<" "<<p[i+1].a*3<<" "<<p[i+1].a/2<<endl;
cout<<"Impossible"<<endl;
return 0;
}
}
cout<<"Possible"<<endl;
return 0;
}