[Lucas定理推广] hdu 4349 and poj 3219

hdu 4349 Xiao Ming‘s Hope

题意:

给n,求c(n,0),c(n,1)....c(n,n)中奇数的个数

思路:

因为只有奇偶区别,想到二进制

运用Lucas定理,将n,m(0~n) 化为二进制数

a,b为n,m的二进制数

根据定理 C(n,m)=C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])

然后因为C(0,1)=0、C(0,0)=1、C(1,0)=1、C(1,1)=1

为了保证C(n,m)=1

那么当n的二进制位上是0的时候,m的相应位置就必须是0

如果n的二进制位上是1的话,m是0或1都无所谓,就有两种取法

所以最后的答案就是2^cnt,cnt为n的二进制位上1的个数。

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"stack"
#include"algorithm"
#include"iostream"
#define ll __int64
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        int cnt=0;
        while(n)
        {
            if(n%2==1) cnt++;
            n/=2;
        }
        printf("%d\n",1<<cnt);
    }
    return 0;
}

poj 3219 Binomial Coefficients

题意:

给n、m,问C(n,m)的奇偶性

思路:

上面的Lucas定理结论,

n和m全都转为二进制数

n的二进制位上为0的位置,如果对应m的位置上不是0,则结果为0

否则为1

那么其实就是对m来说,m上面是1的地方 对应过去是0 就是0

那么就是 (n&m)!=m 就为0 否则为1

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"stack"
#include"algorithm"
#include"iostream"
#define ll __int64
using namespace std;
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        if((n&m)!=m) puts("0");
        else puts("1");
    }
    return 0;
}
时间: 2024-10-11 00:49:33

[Lucas定理推广] hdu 4349 and poj 3219的相关文章

hdu 4349 求C(n,0),C(n,1),C(n,2)...C(n,n).当中有多少个奇数 (Lucas定理推广)

Lucas定理:把n写成p进制a[n]a[n-1]a[n-2]...a[0],把m写成p进制b[n]b[n-1]b[n-2]...b[0],则C(n,m)与C(a[n],b[n])*C(a[n-1],b[n-1])*C(a[n-2],b[-2])*....*C(a[0],b[0])模p同余. 即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p) 这题是求C(n,0),C(n,1),C(n,2)...C(n,n).当中有多少个奇数也是就是说 求C(n,m)%2==1

HDU 4349 Xiao Ming&#39;s Hope(数学题,Lucas定理)

解题思路: 深入理解lucas定理. Lucas定理:把n写成p进制a[n]a[n-1]a[n-2]...a[0],把m写成p进制b[n]b[n-1]b[n-2]...b[0],则C(n,m)与C(a[n],b[n])*C(a[n-1],b[n-1])*C(a[n-2],b[-2])*....*C(a[0],b[0])模p同余. 这题p为2,所以a[i]和b[i]为0或者1.又因为C(1,0), C(1,1), 即当n等于1时,结果才等于1. 所以写出n的二进制,m从0遍历到n,每一次遍历把m写

HDU 4349 Xiao Ming&#39;s Hope lucas定理

Xiao Ming's Hope Time Limit:1000MS     Memory Limit:32768KB 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 2

hdu 4349 Xiao Ming&#39;s Hope (Lucas定理推导)

题意:求C (n,0),C (n,1),C (n,2)...C (n,n).奇数的个数 思路:我们分析C(n,m)%2,那么由Lucas定理可知,n和m可以写成二进制的形式,假设n=1001101,那么m是0~1001101,我们知道C(0,1)=0,因此如果n=1001101的0对应位置的m二进制位为1那么C(n,m) % 2==0,因此m对应n为0的位置只能填0,而1的位置填0,填1都是1(C(1,0)=C(1,1)=1),不影响结果为奇数,并且保证不会出n的范围,因此所有的情况即是n中1位

HDU 4349——Xiao Ming&#39;s Hope——————【Lucas定理】

Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1786    Accepted Submission(s): 1182 Problem Description Xiao Ming likes counting numbers very much, especially he is fond of cou

HDU ACM 4349 Xiao Ming&#39;s Hope -&gt;lucas定理的推到

分析:Lucas定理的推导题,要求 C(n,m)%2,那么由lucas定理,写成二进制观察,如 n=1001101,m是从000000到1001101的枚举,在该定理中C(0,1)=0,因此n=1001101的0对应位置的m二进制位为1那么C(n,m) % 2==0,因此m对应n为0的位置只能填0,而1的位置填0,填1都是1(C(1,0)=C(1,1)=1),不影响结果为奇数,并且保证不会超出n的范围,所有情况即是n中1位置对应m位置0,1的枚举,那么结果就是:2^(n中1的个数). #incl

HDU 4349 组合数的奇数个数-杨辉三角&amp;Lucas定理

题意:给你一个n,求C (n,0),C (n,1),C (n,2)...C (n,n),奇数的个数. 分析: Lucas定理: A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])  modp同余 即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p) 来看这一题,求奇数,那么我们

HDU 4349 Xiao Ming&#39;s Hope (Lucas)

题意:给定一个 n,问你在 C(n, 0) - C(n , n) 中有多少个奇数. 析:Lucas定理,C(b[i], a[i]),只要不为0,那么就是奇数,然后b[i],是固定的,也就是说a[i] 只有 b[i]+1种情况.最后乘起来就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <

HDU 3037 Saving Beans (Lucas定理)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3037 推出公式为C(n + m, m) % p, 用Lucas定理求大组合数取模的值 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int t; long long n, m, p; long long pow(long long n, long lo