2019-2020大中小学生联合训练赛第三场 F题 存在

添加链接描述

题目描述

给出一个B数组B[0…n-1]。你要寻找另一个数组A[0…n-1],使得A数组同时满足如下条件:
1、对于0<=i<n, A[i]必须是2^j,其中j是正整数。即A[i]必须是2,4,8,16,32,64…等这样的数。
2、对于0<=i<n, A[i]^B[i]必须能整除P, 其中P=A[0] * A[1] * A[2] * …A[n-1]。
注意:对于本题,都是表示幂,也就是多少次方,例如:23表示2的3次方,故2^3=8。
如果你能找到这样满足上面要求的A数组,那么输出“Possible”,或者输出“Impossible”,双引号不用输出。

输入

多组测试数据。
第一行,一个整数G,表示有G组测试数据。1 <= G <= 13。
每组测试数据格式:
第一行,一个整数n。 1 <= n <= 50。
第二行,n个整数,第i个整数是B[i]。 1 <= B[i] <= 10。

输出

共G行,每行一个字符串,“Possible”或者“Impossible”,双引号不用输出。
样例输入 Copy
4
2
3 2
3
3 3 3
2
1 10
3
2 3 10

样例输出 Copy

Possible
Possible
Impossible
Possible

提示

第一组测试数据:A[] = {2,2}
第二组测试数据:A[] = {2,2,2}
第四组测试数据:A[] = {8,4,2}

题目分析:

我们假设数组A初始化状态全为2,因为数组B有n个数,所以数组A的初始化状态为n个2,
我们拿最后一组测试样例来推导一下数组A 的变化过程
在这里插入图片描述
在这里插入图片描述
以上为有解时的思路
但是当无解时即输出Impossible时
我的程序没法自己结束,然后我就加了个上限,当p的指数大于这个数的时候就impossible

附AC码

在这里插入代#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int b[1000],a[1000];
int main() {
	int G;
	cin >> G;
	while(G--) {
		int n,i,j,num;
		cin>>n;
		num=n;
		for(i=1; i<=n; i++) {
			cin>>b[i];
			a[i]=b[i];
		}
		int temp=0,flag=1;


		for(i=1; i<=n; i++) {
			if(b[i]<num) {
				b[i]+=a[i];          //因为没有数组A ,只能把数组A 的变化量体现在数组B上 
				i=0;                  //只要不满足条件 就从头开始重新判断 
				num++;              // p的幂加一 
				temp=0;
				if(num>6666) {                    // P的幂加一  ,设定上限666 
					goto loop;
					break;
				}
			} else
				temp++;            //每有一个 满足情况的数。计数器加一 
		}


		if(temp==n) {            //当计数器的值与数组中个数相等时说明所有的数都符合条件,           
			printf("Possible\n");  // 即找到了符合条件的数组A 
			flag=0;                               
			goto loop;
		}

		else
			printf("Impossible\n");
loop:                                        //添加一个标记,幂超出范围时终止程序 
		if(flag)
			printf("Impossible\n");


	}
	return 0;
}
码片

大佬们有无更好的方法

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值