UPC-存在

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-轮月

发布了32 篇原创文章 · 获赞 12 · 访问量 1201

猜你喜欢

转载自blog.csdn.net/qq_35339563/article/details/103285034
UPC
今日推荐