triblenim
一堆石子分成三份的nim
遊戲,求先手必敗的組合數。
首先我們需要知道這個結論:a⨁b
⨁c==
0a \bigoplus b \bigoplus c == 0
a⨁b⨁c=
=0的情況下先手必敗,其中a
,b
,c
為每一堆石子的數量。
接下來我們分情況討論:
在石子總數為奇數的情況下,沒有辦法使得異或和為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
,對於這三個數字可以有三種排列:011
,101
,110
.
所以我們的答案為 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,就是落入同乙個迴圈圈。請寫出這個迴圈圈中最大的那個數字。請填寫該最大數字。注意 你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性...