FHJの高齢者の願い
問題の意味
あなたが見つけるように、あなたの数Nを与えるために\ [C ^ {0} _ {N} \ C ^ {1} _ {N} \ C ^ {2} _ {N} \ドット\ \ C ^ {N} _ {N} \]数のいくつかの組み合わせが奇数です。
問題解決のためのアイデア
CX高齢者の質問への問題への解決策:
この質問は、実際にルーカス定理を調べています。
ルーカス定理:(書かれた手順は、再帰の後半であってもよいです)
セット\(P \)は、その後、素数であります:
\ [C ^ {M} _ {N}(\%のP)= C ^ {Mの\%のP} _ {N \%のP} * C ^ {⌊m/P⌋} _ {⌊n/P⌋} (\%のP)\]
文に分割することができる組み合わせの数(P \)\上記式:(と本質的に同じ次の16進数の製品)
\ [N = N_ {K} * P ^ {K} + N_ {K-1} * P ^ {K-1} + ... + N_ {1} * P + N_0 \]
\ [M = M_ {K} * P ^ {K} + M_ {K-1} * P ^ {K-1} + ... + M_ {1} * P + M_0 \]
次いで、(実際には、式で\(N、Mの\)は、に分解される\(P \) 16進数で)。
\ [C ^ {M} _ {N}(\%P)= C ^ {M_ {K}} _ {N_ {K}} * C ^ {M_ {K-1}} _ {N_ {K-1 }} * ... * C ^ {M_ {0}} _ {N_ {0}}(\%のP)\]
(P = 2 \)\場合、実際には、わずか4ケース:\を(^ 0 ,,,,, C_1、C_0 ^ 1、C_0 ^ 0、C_1 ^ 1 \) 、これだけ\(C_0 ^ 1 = 0 \) 、残りは1です。
したがって、この問題のために、我々は実際に見ている\(^ 0 C_N ... C_N ^ N \) の数は\(^ C_Nメートルの\)を満たす\(^ C_Nメートルの\%2 = 1 \) 。
所与のため\(N \) 、我々が考慮する必要があり、\(m個\) 、該当する場合\(N \)のバイナリビットが0である場合、\(m個\)バイナリビットを対応するのみので(0とすることができる(\ ^ 1 = 0 C_0 \))、該当する場合\(N- \)のバイナリビットは、その後、1 \(m個\) 1ビットに対応するもゼロであってもよいです。(これはまた、統計的な保証のnのLeq \ \ \(m)を)。
だから、その答えは、可能な0の全ての位置に2進数の1をnまたは1です。その\(CNT 2 ^ {} \)、\ (CNT \)の\(\ N-)バイナリ1の数。
問題は、実際には、法律のうち、本当に強い探してによって発見されました。
コードの実装
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int cnt = 0;
while (n) {
if (n & 1) cnt++;
n >>= 1;
}
printf("%d\n", 1 << cnt);
}
return 0;
}