HDU 4349 Xiao Ming's Hope (Lucas定理的應用)

_TCgogogo_發表於2015-09-07


Xiao Ming's Hope

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1811    Accepted Submission(s): 1204


Problem Description

Xiao Ming likes counting numbers very much, especially he is fond of counting odd numbers. Maybe he thinks it is the best way to show he is alone without a girl friend. The day 2011.11.11 comes. Seeing classmates walking with their girl friends, he coundn't help running into his classroom, and then opened his maths book preparing to count odd numbers. He looked at his book, then he found a question "C(n,0)+C(n,1)+C(n,2)+...+C(n,n)=?". Of course, Xiao Ming knew the answer, but he didn't care about that , What he wanted to know was that how many odd numbers there were? Then he began to count odd numbers. When n is equal to 1, C(1,0)=C(1,1)=1, there are 2 odd numbers. When n is equal to 2, C(2,0)=C(2,2)=1, there are 2 odd numbers...... Suddenly, he found a girl was watching him counting odd numbers. In order to show his gifts on maths, he wrote several big numbers what n would be equal to, but he found it was impossible to finished his tasks, then he sent a piece of information to you, and wanted you a excellent programmer to help him, he really didn't want to let her down. Can you help him?
 
Input
Each line contains a integer n(1<=n<=108)
 
Output
A single line with the number of odd numbers of C(n,0),C(n,1),C(n,2)...C(n,n).
 
Sample Input
1 2 11
 
Sample Output
2 2 8
 
Author
HIT
 
Source
 
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=4349


題目大意:求C(n,i) (0 <= i <= n)中奇數的個數


題目分析:實際上就是求C(n, i) % 2 == 1的個數,應用Lucas定理,C(n, m) % p =C(n % p, m % p) * C(n / p, m / p),又因為C(0, 0) = 1, C(0, 1) = 0, C(1, 0) = 1, C(1, 1) = 1,可以發現如果C(n ,i)要為1,如果n的位置為0的話,m的位置必須是0,如果n的位置是1的話,m的位置可以為1或者0,設n中1的個數為cnt,則答案就是2^cnt,因為對每個n為1的位置,m有兩種選擇


#include <cstdio>

int main()
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        int cnt = 0;
        while(n)
        {
            cnt += (n & 1);
            n >>= 1;
        }
        printf("%d\n", 1 << cnt);
    }
}


相關文章