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;
}