QDUOJの数論FHJ先輩ウィッシュ

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;
}

おすすめ

転載: www.cnblogs.com/alking1001/p/11580789.html