nyojb 2359 巴什博弈變形
阿新 • • 發佈:2017-09-01
-s () nbsp 否則 描述 數據 targe std spa
提交: 237 解決: 43
[提交][狀態][討論版]
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 巴什博弈變形