https://codeforces.com/gym/100917/problem/I
水题啊,结果题目条件看差了,每局下注必须要是正整数,一开始找出随机种子之后输的输出0去了。
我们先用50块钱找出前50次的输赢情况,然后再从1到1<<20枚举x1,向后跑50位,如果情况一致那就是的
接下来就赢就赌全部,输就赌1块钱。
#include<bits/stdc++.h> #define maxl 51 using namespace std; const int mod=1<<20; int f[maxl]; inline int calc(int x){return (1LL*x*487237+1011807)%mod;} int main() { int now,lastnow,x1; scanf("%d",&now);lastnow=now; for(int i=1;i<=50;i++) { puts("1"); fflush(stdout); scanf("%d",&now); if(now==-1) return 0; if(now<lastnow) f[i]=0; else f[i]=1; lastnow=now; } for(int i=0;i<mod;i++) { int x=i;bool flag=true; for(int j=1;j<=50;j++) { if(f[j]!=(__builtin_popcount(x)&1)) { flag=false; break; } x=calc(x); } if(flag==true) { x1=i; break; } } for(int i=1;i<=50;i++) x1=calc(x1); while(1) { if((__builtin_popcount(x1)&1)) { printf("%d\n",now); fflush(stdout); } else { puts("1"); fflush(stdout); } x1=calc(x1); scanf("%d",&now); if(now==-1) break; } return 0; }