题目描述
给出一个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;
}
码片
大佬们有无更好的方法