- Division by Two and Permutation CodeForces - 1624C

You are given an array aaa consisting of nnn positive integers. You can perform operations on it.

In one operation you can replace any element of the array aia_iai​ with ⌊ai2⌋\lfloor \frac{a_i}{2} \rfloor⌊2ai​​⌋, that is, by an integer part of dividing aia_iai​ by 222 (rounding down).

See if you can apply the operation some number of times (possible 000) to make the array aaa become a permutation of numbers from 111 to nnn —that is, so that it contains all numbers from 111 to nnn, each exactly once.

For example, if a=[1,8,25,2]a = [1, 8, 25, 2]a=[1,8,25,2], n=4n = 4n=4, then the answer is yes. You could do the following:

  1. Replace 888 with ⌊82⌋=4\lfloor \frac{8}{2} \rfloor = 4⌊28​⌋=4, then a=[1,4,25,2]a = [1, 4, 25, 2]a=[1,4,25,2].
  2. Replace 252525 with ⌊252⌋=12\lfloor \frac{25}{2} \rfloor = 12⌊225​⌋=12, then a=[1,4,12,2]a = [1, 4, 12, 2]a=[1,4,12,2].
  3. Replace 121212 with ⌊122⌋=6\lfloor \frac{12}{2} \rfloor = 6⌊212​⌋=6, then a=[1,4,6,2]a = [1, 4, 6, 2]a=[1,4,6,2].
  4. Replace 666 with ⌊62⌋=3\lfloor \frac{6}{2} \rfloor = 3⌊26​⌋=3, then a=[1,4,3,2]a = [1, 4, 3, 2]a=[1,4,3,2].

Input

The first line of input data contains an integer ttt (1≤t≤1041 \le t \le 10^41≤t≤104) —the number of test cases.

Each test case contains exactly two lines. The first one contains an integer nnn (1≤n≤501 \le n \le 501≤n≤50), the second one contains integers a1,a2,…,ana_1, a_2, \dots, a_na1​,a2​,…,an​ (1≤ai≤1091 \le a_i \le 10^91≤ai​≤109).

Output

For each test case, output on a separate line:

  • YES if you can make the array aaa become a permutation of numbers from 111 to nnn,
  • NO otherwise.

You can output YES and NO in any case (for example, strings yEs, yes, Yes and YES will be recognized as a positive response).

Sample 1

InputcopyOutputcopy
6
4
1 8 25 2
2
1 1
9
9 8 3 4 2 7 1 5 6
3
8 2 1
4
24 7 16 7
5
22 6 22 4 22

思路:我们用一个数组a作为标记,数组中有过该数则标记为一,若a[n]为0的话,则说明该数第一次为出现,标记为1,若a[n]为1的话,则说明有该数字了。

先判断该数是否大于n,如果大于n的话则除以2,直到小于n为止,若a[n]为0,则标记为1,如果a[n]为1 的话就说明该数已经出现过了,那我们再将该数除以二,直到成为没有出现过的数,然后标记。

#include<bits/stdc++.h>
using namespace std;
bool  a[60];
int main()
{
	int t;cin>>t;
	while(t--)
	{
		memset(a,false,sizeof a);
		int n;cin>>n;
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			int x;cin>>x;
			while(x>n) x/=2;	
			while(x>0)
			{
				if(!a[x])
				{
					a[x]=true;
					ans++;
					break;
				}
				x/=2;
			}
		}
		if(ans==n) cout<<"YES"<<endl;
		else 
			cout<<"NO"<<endl;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值