「浪潮杯」山東第七屆ACM TribleNim

2021-10-09 12:35:31 字數 2300 閱讀 6067

triblenim

一堆石子分成三份的nim遊戲,求先手必敗的組合數。

首先我們需要知道這個結論:a⨁b

⨁c==

0a \bigoplus b \bigoplus c == 0

a⨁b⨁c=

=0的情況下先手必敗,其中abc為每一堆石子的數量。

接下來我們分情況討論:

在石子總數為奇數的情況下,沒有辦法使得異或和為0。將乙個奇數拆分成三個整數,則其中必然存在至少乙個奇數使得該位的異或和為1

在石子總數為偶數的情況下,要使得三堆石子的異或和為0,我們需要使得二進位制數字的每一位中值為1的數字的數量為2,或者0

這樣才可以使得最終的異或和的每一位都為0

舉個例子:

14 = 1110 = 1000 + 100 + 10;

其中 1000 = 0000 + 0100 + 0100, 100 = 000 + 010 + 010, 10 = 00 + 01 + 01.

可以看到其中的每一位1所拆成的三個數字都有兩個1和乙個0,對於這三個數字可以有三種排列:011101110.

所以我們的答案為 3

n3^n

3n.真的嗎?考慮一下題意,每一堆石子的數量都不能為0,並且對於情況[1,2,3][1,3,2]是算作同一種情況的,那麼我們就需要減去這兩種情況的數量。

首先考慮石子數量為0的情況,由於我們拆分每個1後有三種情況,其中最多只有一位為0,所以所得的石子中最多只有一堆的數量為0。一共有三堆,所以需要減去3

再考慮重複的情況,每三位數字都有三種全排列,即 a33

=6

a^3_3 = 6

a33​=6

種情況,所以除以6。

這樣就得到了最終的結果 ans

=(3s

um−3

)/

6ans = (3^ - 3) / 6

ans=(3

sum−

3)/6

,其中sum為石子總數的二進位制表示中1的數量。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

//#pragma gcc optimize(2)

#define io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

#define ull unsigned long long

#define ll long long

#define rep(i, x, y) for(int i=x;i<=y;i++)

#define mms(x, n) memset(x, n, sizeof(x))

#define mmc(a, tree) memcpy(a, tree, sizeof(tree))

#define eps (1e-8)

#define pi (acos(-1.0))

#define inf (0x3f3f3f3f)

#define mod (ull)(1e9+7)

typedef pair<

int,

int> p;

intmain()

ll ans =

(pow(3

, num)-3

)/6;

printf

("%lld\n"

, ans);}

}return0;

}

第七屆藍橋杯題解

純 無解析,第七題和第十題不會答案1 171700 2.26 3.29 4.swap a,p,j 5.f a,k 1,m i,b 6.1580 第一題 煤球數目 有一堆煤球,堆成三角稜錐形。具體 第一層放1個,第二層3個 排列成三角形 第三層6個 排列成三角形 第四層10個 排列成三角形 如果一共有...

第七屆山東ACM省賽總結

省賽總結 比賽的第一天是打cccc網路賽,因為賽前找電腦的原因讓我比賽中的狀態很不好,雖然第一階段是水題在掌控範圍內,但是由於這個是團體賽,打不好會託隊友的後腿,還是各種緊張,開局就做的很不好,老是擔心會卡題,有句話說的好,怕什麼,來什麼,果然,我卡題了。卡在了划拳那個題,賽後我去看那個題,交了足足...

藍橋杯第七屆 平方怪圈

平方怪圈 如果把乙個正整數的每一位都平方後再求和,得到乙個新的正整數。對新產生的正整數再做同樣的處理。如此一來,你會發現,不管開始取的是什麼數字,最終如果不是落入1,就是落入同乙個迴圈圈。請寫出這個迴圈圈中最大的那個數字。請填寫該最大數字。注意 你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性...