一開(kāi)始看還以為是一道博弈的題目,再仔細(xì)看才發(fā)現(xiàn)并不是博弈,也不是很難。大致意思是:有n堆石子,第i堆有Ki個(gè)石子,每輪一方可以從任意堆中取出一個(gè)或多個(gè)石子,所有石子都被取光時(shí),游戲也結(jié)束了,那個(gè)最后一輪拿走石子的人就是勝利者。問(wèn)你有多少種方法使對(duì)方處于必?cái)〉木置妗n}目并不難,是因?yàn)轭}目中已經(jīng)告訴你了產(chǎn)生必?cái)【置娴臈l件:如果所有堆的石子數(shù)的異或和為0,那么處于此局面的人就必?cái) ?br> 因?yàn)槊看沃荒軓囊粋€(gè)堆中取石子,所以只要對(duì)于每個(gè)堆i,先求出其他所有堆的異或和temp,再看0~Ki-1與這個(gè)異或和再進(jìn)行異或是否為0,只要為0就得到一種勝利的方法。自己先是想枚舉0~Ki-1,與temp進(jìn)行異或。后來(lái)感覺(jué)沒(méi)有必要,只要Ki>temp就可以了,因?yàn)槿魪亩裪中取出x個(gè)石子,Ki-x異或temp==0 <==> Ki-x==temp,只要Ki>temp,就存在Ki-x==temp。
#include <cstdio>
#define PILE 1001
__int64 stone[PILE], test; //test為所有石子數(shù)的異或和
int piles;
bool Input ()
{
scanf("%d", &piles);
if ( piles == 0 )
return false;
int i;
for (i=0; i<piles; i++)
scanf("%I64d", &stone[i]);
return true;
}
void Solve ()
{
int i, ans;
__int64 temp;
test = 0;
ans = 0;
for (i=0; i<piles; i++)
test ^= stone[i];
if ( test != 0 )
{
for (i=0; i<piles; i++)
{
temp = test ^ stone[i]; //再與stone[i]做一次異或,相當(dāng)于除stone[i]對(duì)其他所有堆的石子進(jìn)行異或
if ( stone[i] > temp )
ans++;
}
}
printf("%d\n", ans);
}
int main ()
{
while ( Input() )
{
Solve();
}
return 0;
}