zoukankan      html  css  js  c++  java
  • E. XOR Guessing

    一道很有意思的题目,也是我第一次写交互题

    题意是,让你猜x,你可以输出两次,每次输出100个数,取值范围在0到2^14-1,要保证这总共200个数各不相同

    每一次输出时,系统会随机挑选你输出的100个数中的一个,拿x和这个数做异或,将异或的结果告诉你

    最后让你猜x的值

    思路是:因为输出数字的范围是0-2^14-1,实际上你可以输出的数的数量级是在0-2^13,最大可以输出14位二进制

    这样你可以将你输出给系统的数分为两组,一组是二进制形式下前7位为0(也就是小于2^7 = 128的所有数)的数,一组是后7位为0(把前面那些数通过位运算左移7位即可枚举出这类数)的数

    这样一来,输出第一组数时,不管系统挑哪个数,异或后的结果前七位和x的一样,输出第二组数时后7位和x一样。这样你就知道了x的前7位和后7位的值,最后只要用一点位运算的技巧

    就可以将x求出来。

    PS.左移是右边补0,右移是左边补1

    #include<bits/stdc++.h>
     
    using namespace std;
     
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	printf("?");
    	for(int i=1; i<=100; i++) printf(" %d", i << 7);
    	printf("
    ");
    	fflush(stdout);
    	int ans = 0;
    	int a;
    	scanf("%d", &a);
    	ans |= a & 127;
    	printf("?");
    	for(int i=1; i<=100; i++) printf(" %d", i);
    	printf("
    ");
    	fflush(stdout);
    	scanf("%d", &a);
    	ans |= a >> 7 << 7;
    	printf("! %d
    ", ans);
    	fflush(stdout);
    	return 0;
    }
    

      

  • 相关阅读:
    apache2 开源协议
    zend framework入门教程
    对open页的打开页面进行刷新
    mysql -- 视图
    MySQL ---存储过程和触发器
    mysql --存储过程 select ...into
    mysql -- 存储过程,游标,错误异常处理
    mysql --存储过程 退出
    mysql -- 存储过程 in out inout
    mysql -- 死锁
  • 原文地址:https://www.cnblogs.com/ssNiper/p/11478297.html
Copyright © 2011-2022 走看看