Codeforces 1103B Game with modulo(交互题)
题目链接:https://codeforces.com/problemset/problem/1103/B
题目大意:求a的值。你可以问机器两个数x和y,当x%a>=y%a时返回x,否则返回y。最多可问60次。
解题思路:
从[0,1],[1,2],[2,4]开始枚举x和y,使y总是为x的两倍。如果a>y,返回的就是y,否则说明a在区间[x,y]之间。
然后二分区间[x,y],如果询问(mid,y)返回x,说明a在[x,mid];否则,a在[mid,y]。
当x+1==y时,y就是答案。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 char ask(int x,int y) 5 { 6 char t; 7 printf("? %d %d\n",x,y); 8 fflush(stdout); 9 cin>>t; 10 return t; 11 } 12 int main() 13 { 14 string s; 15 while(cin>>s){ 16 if(s=="end") break; 17 int l=0,r=1; 18 while(ask(l,r)=='y') 19 { 20 l=r; 21 r*=2; 22 } 23 while(l+1<r) 24 { 25 int mid=(l+r)/2; 26 if(ask(mid,r)=='x') 27 l=mid; 28 else r=mid; 29 } 30 printf("! %d\n",r); 31 fflush(stdout); 32 } 33 return 0; 34 }