1. 程式人生 > >nyojb 2359 巴什博弈變形

nyojb 2359 巴什博弈變形

-s () nbsp 否則 描述 數據 targe std spa

http://acm.nyist.me/JudgeOnline/problem.php?id=2359

2359: 巴什博弈?

時間限制: 1 Sec 內存限制: 30 MB
提交: 237 解決: 43
[提交][狀態][討論版]

題目描述

有n個石子,有兩人輪流從中取石子,最少a個最多b個,誰沒得取(即當輪到他取是已經沒有石子可以取了,也就是說此時石子數量小於a)誰贏,現在,LLM先取,問你LLM能贏嗎

輸入

每個測試樣例少於100000組測試數據

每組測試樣例第一行三個整數n,a,b

1<=a<=b,n<=100000000

輸出

如果LLM能贏,輸出YES,否則輸出NO

樣例輸入

1 1 1
2 1 2

樣例輸出

NO
YES


幾乎從未做過博弈的題目,只是上學期寫過兩道模板題,這種題目就是找到必敗態/必勝態,這道題目要求只要輪到你取且石子數<a那麽你就是勝利者,那麽到最後遇到什麽數量的石子必然會輸呢,
答案是[a,2*a),因為無論怎樣取剩余的石子一定小於a(最小是0),那麽對手必然會勝利,所以這是一個必敗態,令x(-[a,2*a),那麽x+(a+b)*k也是必敗態,無論你取走多少只要對手取走a+b-i,
最後面臨x的人必然是你,所以必敗,那我們就可以根據這個範圍來討論了,
當a<=n%(a+b)<2*a時候必敗;
n%(a+b)
<a的時候,先手只要取走一個b,那麽對手剩下的就是(a+b)*(k-1)+(x+a),由於x<a所以a<=x+a<2*a轉化為了必敗態。
當a+b>n%(a+b)>2*a的時候,因為n%(a+b)-a<b,我們可以取走n%(a+b)-a個給對手剩下 a+(a+b)*k,又是必敗態。
巧妙地數學,雖然每次數學題都是一臉懵逼- -
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 int main()
 5 {
 6     int n,i,j,a,b;
7 while(scanf("%d%d%d",&n,&a,&b)==3){ 8 int t=n%(a+b); 9 if(t<a) puts("YES"); 10 else if(t<2*a) puts("NO"); 11 else puts("YES"); 12 } 13 return 0; 14 }

 

nyojb 2359 巴什博弈變形