题目链接:http://codeforces.com/contest/1088/problem/D
我们只需要通过两个数的大小和两次异或就能知道当前位是否为1,然后从后往前走,每个位次只需要两次就能判断出来为1还是0,所以需要60次,再加上最开始比较两个数的大小异或一次所以一共需要异或61次。
#include<stdio.h>
long long int i,j,m,n,sum,qum,ssum,qqum,a[100];
int main()
{
sum=0,qum=0;
int flag1,flag2,flag;
a[1]=2;
for(i=2;i<=40;i++)
{
a[i]=a[i-1]*2;
}
a[0]=1;
printf("? 0 0\n");
fflush(stdout);
scanf("%d",&flag);
for(i=29;i>=0;i--)
{
if(flag==1)
{
printf("? %lld %lld\n",a[i]+sum,qum);
fflush(stdout);
scanf("%d",&flag1);
printf("? %lld %lld\n",sum,a[i]+qum);
fflush(stdout);
scanf("%d",&flag2);
if(flag1==-1&&flag2==-1)
{
sum+=a[i];
flag=-1;
}
else if(flag1==1&&flag2==1)
{
sum+=a[i];
flag=1;
}
else if(flag1==1&&flag2==-1)
{
flag=1;
}
else if(flag1==0)
{
sum+=a[i];
flag=0;
}
else
{
sum+=a[i];
qum+=a[i];
flag=1;
}
}
else if(flag==0)
{
printf("? %lld %lld\n",a[i]+sum,qum);
fflush(stdout);
scanf("%d",&flag1);
if(flag1==-1)
{
sum+=a[i];
qum+=a[i];
flag=0;
}
else if(flag1==1)
{
flag=0;
}
}
else
{
printf("? %lld %lld\n",a[i]+sum,qum);
fflush(stdout);
scanf("%d",&flag1);
printf("? %lld %lld\n",sum,a[i]+qum);
fflush(stdout);
scanf("%d",&flag2);
if(flag1==1&&flag2==1)
{
qum+=a[i];
flag=1;
}
else if(flag1==1&&flag2==-1)
{
flag=-1;
}
else if(flag1==-1&&flag2==1)
{
sum+=a[i];
qum+=a[i];
flag=-1;
}
else if(flag1==1&&flag2==0)
{
qum+=a[i];
flag=0;
}
else
{
qum+=a[i];
flag=-1;
}
}
}
printf("! %lld %lld\n",sum,qum);
return 0;
}