6、存在(f.cpp)
【题目描述】
给出一个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”,双引号不用输出。
输入样例 | 输出样例 | 样例解释 |
4 2 3 2 3 3 3 3 2 1 10 3 2 3 10 | Possible Possible Impossible Possible | 第一组测试数据:A[] = {2,2} 第二组测试数据:A[] = {2,2,2} 第四组测试数据:A[] = {8,4,2} |
这道题也太简单了吧,根本就不用讲,啊呸!
Bi~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for(int j=2;j<=10000;j++){h=0;for(int k=1;k<=n;k++){cm=0;cm+=j/a[k];if(j%a[k]!=0) cm++;h+=cm;}if(h==j){p=1;break;}}
首先看看这段代码,这是这道题的核心。
先从二的二次幂开始枚举。
最大是二的一万次幂。
如下图:
行了,上代码!
#include<bits/stdc++.h>
using namespace std;
int g,n,a[55],h,p,cm;
int main()
{cin>>g;for(int i=1;i<=g;i++){h=0;p=0;cin>>n;for(int j=1;j<=n;j++) cin>>a[j];for(int j=2;j<=10000;j++){h=0;for(int k=1;k<=n;k++){cm=j/a[k];if(j%a[k]!=0) cm++;h+=cm;}if(h==j){p=1;break;}}if(p==1) cout<<"Possible";else cout<<"Impossible";cout<<endl;}return 0;
}
0分代码,欢迎参考,有错请评论或私信。