UPC-存在
题目描述
给出一个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]。
注意:对于本题,^都是表示幂,也就是多少次方,例如:
2^3表示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”,双引号不用输出。
Sample Input
4
2
3 2
3
3 3 3
2
1 10
3
2 3 10
Sample Output
Possible
Possible
Impossible
Possible
Hint
第一组测试数据:A[] = {2,2}
第二组测试数据:A[] = {2,2,2}
第四组测试数据:A[] = {8,4,2}
#include<bits/stdc++.h>
using namespace std;
int u[100000];
int save[100000];
int main()
{
int t;
cin>>t;
while(t--) {
int flage=0;
int num;
cin>>num;
for(int i=0; i<num; i++) {
scanf("%d",&u[i]);
save[i]=u[i];
}
int mark=num;
int s;
for(int i=0; i<50000; i++) {
s=1;
int temp=0;
for(int q=0; q<num; q++)
if(u[q]<mark) {
u[q]+=save[q];
temp++;
s=0;
}
mark+=temp;
if(s) {
printf("Possible\n");
flage=1;
goto A;
}
}
A:
if(!flage) {
printf("Impossible\n");
}
}
return 0;
}
By-轮月