(事業部の定格。2)教育Codeforcesラウンド71 -E。XOR Guessing-交互题

(事業部の定格。2)教育Codeforcesラウンド71 -E。XOR Guessing-交互题


【問題の内容】

2つのクエリの総数、すべての所与のクエリー\(100 \)異なる数、各クエリ評価システムのための、ランダム\(100 \)の数を選択する\(\)は、返し(\ \ oplus X- \) あなたは値が二度返さ推測渡しましょう\(X \)の値です。2問い合わせ必要\(200 \)互いに異なる数、及び確保と題する\(X \)値が固定されています。

【溶液】

タイトルに必要なすべてのチャレンジデータ、すなわち\(X \)の値\([0,2 ^ {14} -1] \)の範囲、そして2つだけの問い合わせで、XORの性質に応じて、\(0 \)排他的または任意の数は変更されません。だから、決定するのは初めてのため、つまり、二つに答えを得ることができます\(X \)バイナリ高い\(7 \)高い最初の問い合わせであるビット、すべてのクエリの数\(7 \)ビットをすべてである\(0 \)の排他的論理和した後、このように任意の数から選択された高評価システムを確保する値を返し、\(7 \)を有する一定のビット\(X \)高い\(7 \)同じビット。同様に、お問い合わせのすべての低数限り二次\(7 \)ビットが全てです\(0 \) あなたは最終的に合併の値の2倍にすることができ取得します。


【コード】

/*
 * @Author: Simon 
 * @Date: 2019-08-27 20:36:36 
 * @Last Modified by: Simon
 * @Last Modified time: 2019-08-27 21:57:17
 */
#include<bits/stdc++.h>
using namespace std;
typedef int Int;
#define int long long
#define INF 0x3f3f3f3f
#define maxn 200005
int a[maxn];
Int main(){
#ifndef ONLINE_JUDGE
    //freopen("input.in","r",stdin);
    //freopen("output.out","w",stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout<<"? ";
    for(int i=1;i<=100;i++) cout<<i<<" "; //第一次保证高7位为0
    cout<<endl;
    int ans;cin>>ans;
    ans|=127; //低7位全置1
    cout<<"? ";
    for(int i=1;i<=100;i++) cout<<(i<<7)<<' ';//第二次保证低7为0
    cout<<endl;
    int tmp;cin>>tmp;
    (ans&=(tmp|(127<<7))); //合并第二次的低7位
    cout<<"! "<<ans<<endl;
#ifndef ONLINE_JUDGE
    cout<<endl;system("pause");
#endif
    return 0;
}

おすすめ

転載: www.cnblogs.com/--Simon/p/11423572.html