HDU 4349 Xiao Ming's Hope & HDU 6129 Just do it

组合数学中有这这样一个神奇的定理:如果对于两个数n、m,如果(n&m)==m,那么C(n,m)为奇数,否则为偶数。

这个其实很容易证明的把C(n,m)化为阶乘表示:n!/(n!*(n-m)!),如果C(n,m)为奇数除式上方和下方所含有的2的个数应该是一样的,不一样的话肯定为偶数。而n!含2的阶乘的数量其实就是看这个数一直除2然后每次结果加一下知道了,但这样所有数都计算的话复杂度其实还是很大的。那么还有其他的更优算法吗?其实一个数x的阶乘含有质因数2的个数等于x-__builtin_popcount(x)__builtin_popcount(x)为x的二进制下1的个数。

那么C(n,m)为奇数的话n-__builtin_popcount(n)=m-__builtin_popcount(m)+n-m-__builtin_popcount(n-m),n的二进制含1的个数与m,n-m的二进制含1个数的和是一样的。那么只有在(n&m)==m的时候才能满足这个条件。

HDU 4349 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4349

题意:

  给一个n,求C(n,0),C(n,1),C(n,2),……,C(n,n)中奇数的个数。

题解:

  由上面的定理,我们可以很容易的解出这道题,求所有的奇数的个数只需求出n的二进制中1的个数,答案就是1<<__builtin_popcount(n).

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int main() {
 5     while(~scanf("%d",&n)) {
 6         int ans=__builtin_popcount(n);
 7         cout << (1<<ans) << endl;
 8     }
 9     return 0;
10 }

 

HDU 6129 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6129

题意:

  给一个数组a,求这个数组m次xor的前缀和

题解:

  首先打个表,很容易发现第i个数在第j行的第i+k列的贡献度为C(j+k-1,j-1)次,根据XOR规律,如果为奇数次相当于一次贡献,偶数次为0次贡献。只需判断某个数的前x位的数是否存在贡献度就行了。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+100;
int T,n,m,a[maxn],b[maxn];
int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%d%d",&n,&m); memset(b,0,sizeof(b));
        for(int i=1;i<=n;++i) scanf("%d",&a[i]);
        for(int i=1;i<=n;++i) {
            int k=m+i-2,l=i-1;
            if((k&l)==l) for(int j=i;j<=n;++j) b[j]^=a[j-i+1];
        }
        for(int i=1;i<=n;++i) printf("%d%c",b[i],i==n?‘\n‘:‘ ‘);
    }
    return 0;
}

HDU 4349 Xiao Ming's Hope & HDU 6129 Just do it

时间: 2024-10-14 06:34:18

HDU 4349 Xiao Ming's Hope & HDU 6129 Just do it的相关文章

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 4349 Xiao Ming&#39;s Hope 找规律

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4349 Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1723    Accepted Submission(s): 1144 Problem Description Xiao Ming likes coun

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定理. 表示自己就推了前面几个数然后找找规律. C(n, m) 就是 组合n取m: (m!(n-m!)/n!) 如果n==11 : C(11,0):C(11,1):C(11,2):C(11,3):C(11,4):C(11,5): 分别为 (1/1); (1 / 11) ; (11*10 / 2*1)  ;   (11*10*9 / 3*2*1); (11*10*9*8 / 4*3*2*1) ;  (11*10*9

hdu 4349 Xiao Ming&#39;s Hope 规律

Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) 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

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 组合数学

题意:给你n,问在C(n,1),C(n,2)...C(n,n)中有多少个奇数. 比赛的时候打表看出规律,这里给一个数学上的说明. Lucas定理:A,B非负整数,p是质数,A,B化为p进制分别为a[n]a[n-1]...a[0],b[n]b[n-1]...b[0]. 那么组合数C(A,B)与C(a[n],b[n])*...*C(a[0],b[0])模p同余. 证明就不说了,我也不会,给个链接  Lucas定理证明 那再来看这道题就简单了,p=2,C(0,1)=0,C(1,0) = C(1,1)

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