設a
aa表示先手總共取的個數,sod
ds_
sodd
表示奇數項的數目,sev
en
s_se
ven
表示偶數項的數目。
首先我們分析後手取的個數亦為a
aa,即n−k
n-kn−
k為偶數的情況:
注意到若後手取最後乙個時,sod
d,se
ve
n>
0s_,s_>0
sodd,
seve
n>
0,則後手必然勝利,因為他可以根據當前情況調整取哪乙個。由此,當a
na
an時,後手必勝。更進一步,若min
=sod
dmin\,s_\}=s_
min=so
dd,則後手直接取完奇數項,使得剩餘項的和必然為偶數,後手必勝;
所以只需要考慮min
=sev
en
min\,s_\}=s_
min=se
ven
的情況:
設a =s
oddm
od2,
b=se
venm
od
2a=s_\mod 2,b=s_\mod 2
a=sodd
mod
2,b=
seve
nmo
d2,當a=b
=0
a=b=0
a=b=
0時,因為a≥m
in
a\ge min\,s_\}
a≥mi
n,後手直接取完偶數項,剩餘必然還要取偶數個奇數項,則最終結果必然為偶數,後手勝;
當a =b
=1
a=b=1
a=b=
1時,後手直接取完偶數項,剩餘必然還要取奇數個奇數項,則最終結果必然為偶數,後手勝;
當a =0
,b=1
a=0,b=1
a=0,b=
1或a=1,
b=
0a=1,b=0
a=1,b=
0時,先手直接取完偶數項,則剩餘必然還要取偶數個或奇數個奇數項,最終結果必然為奇數,先手勝。
n −k
n-kn−
k為奇數的情況用相同的方法分析即可,不再贅述。
#include#include#include#include#include#includeusing namespace std;
#define clr(a) memset(a,0,sizeof(a))
//--container
//--
typedef long long ll;
int ar[2],n,k;
bool cl()
else
}return 1;
};int main();
51 Nod 1430 奇偶遊戲 博弈
基準時間限制 1 秒 空間限制 131072 kb 分值 160 難度 6級演算法題 收藏 關注 有n個城市,第i個城市有ai個人。daenerys和stannis是兩個惡魔。他們在玩乙個遊戲,他們輪流去破壞城市。每一輪破壞乙個城市並殺光裡面所有的人。直到剩下k個城市為止。如果最後剩下的總人數是偶數...
51nod 硬幣遊戲
有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況也算是相交 有時候不會。請你來計算一下拋一次硬幣之後,該硬幣和直線相交數目的期望。...
51nod 1390 遊戲得分
原題鏈結 1390 遊戲得分 topcoder 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 a與b兩人玩乙個遊戲,這個遊戲有若干個回合 可能0回合 遊戲的回合依次標號為1,2,3,4.你不需要關心遊戲的內容,現在只要知道第i回合勝者會獲得2 i 1分,每回合遊...