1. 程式人生 > 其它 >#互動#CF1375F Integer Game

#互動#CF1375F Integer Game

互動

題目

有三堆石子初始石子數分別為\(a,b,c\),可以選擇先手還是後手操作,
每次操作形如先手選擇一個正整數 \(k\) ,後手自由選擇一堆石子加上 \(k\)
但是不能和上一次操作選擇的石堆相同。
如果在1000次操作內,存在兩堆石子相同則先手必勝,否則先手必敗


分析

考慮如果單純補上兩堆石子的差值那麼後手必然會選擇第三堆石子或者大的那堆石子,
那麼就是要讓後手無法選擇,所以要讓\(b-a=c-b\)並且強制\(c\)這一堆不能選先手必勝,
考慮先設定公差,\(c\)要倒數第二輪,那麼可以先指定\(b\)是哪一堆,一開始設定\(inf\)即可,
那麼\(b\)就是第二大的,因為最後要使\(b*2=a+c\)

,那麼可以將公差設為\(b*2-a-c\)
這樣後手選的數一定是最大的,這樣再設定公差三輪先手必勝


程式碼

#include <cstdio>
#define rr register
using namespace std;
typedef long long lll; lll a[3];
inline signed Get_Rank(lll x){
	printf("%lld\n",x),fflush(stdout);
    rr int ret; scanf("%d",&ret);
    if (!ret) return -1;
    a[--ret]+=x; return ret;
}
signed main(){
	for (rr int i=0;i<3;++i) scanf("%lld",&a[i]);
	printf("First\n"),fflush(stdout);
	rr int now0=Get_Rank(1e10); if (now0==-1) return 0;
	rr int now1=Get_Rank(a[now0]*3-a[0]-a[1]-a[2]); if (now1==-1) return 0;
	Get_Rank(a[now1]-a[now0]);
    return 0;
}