NC21300. 牛牛的or
描述
输入描述
第一行输入一个整数n (1 ≤ n ≤ 50)
第二行输入n个整数ai
第三行输入n个整数bi
0 ≤ ai,bi ≤ 1018
输出描述
输出"Possible"如果能构造出来
否则输出"Impossible"
示例1
输入:
1 7 11
输出:
Possible
示例2
输入:
1 11 7
输出:
Impossible
示例3
输入:
5 3 3 7 5 7 3 5 7 9 11
输出:
Possible
示例4
输入:
3 1 100 1000 100 1000 10000
输出:
Impossible
示例5
输入:
3 261208776456074191 261208776456074191 261208776456074191 333333333333333333 333333333333333333 333333333333333333
输出:
Possible
C++ 解法, 执行用时: 9ms, 内存消耗: 668K, 提交时间: 2021-09-26 21:03:33
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 100; int n,b[N],c[N]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&b[i]); for(int i=1;i<=n;i++) scanf("%d",&c[i]),c[i]-=b[i]; ll ans=1; for(int i=0;i<N;i++){ int a0=1,a1=1; for(int j=1;j<=n;j++){ int eb=b[j]>>i&1; int ec=c[j]>>i&1; int b0=0,b1=0; if(eb&&ec) b1=a1; if(eb&&!ec) { b1=a0; b0=a1; } if(!eb&&!ec) b0=a0; a0=b0,a1=b1; } ans*=(a0+a1); } if(ans==0) puts("Impossible"); else puts("Possible") ; return 0; }