POJ 3252(组合数学)

二进制子集计数算法解析
本文详细解析了一种用于计算二进制表示中特定子集数量的算法,通过构建组合数学中的组合表,并利用位运算进行高效计算。算法首先预处理组合数,然后遍历输入整数的二进制表示,根据二进制位的值来累加子集数量。最终输出的是在给定范围内所有整数满足条件的子集总数。

参照博客   https://blog.youkuaiyun.com/lyy289065406/article/details/6648458

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 using namespace std;
10 int c[35][35]={0};
11 int bin[35]={0};
12 int roun(int n)
13 {
14     int sum=0;
15     int k=n;
16     bin[0]=0;
17     while(k)
18     {
19         bin[++bin[0]]=k%2;
20         k>>=1;
21     }
22     for(int i=1;i<bin[0]-1;i++)
23         for(int j=i/2+1;j<=i;j++)
24             sum+=c[i][j];
25     int zero=0;
26     for(int i=bin[0]-1;i>0;i--)
27     {
28         if(bin[i]==1)
29         {
30             for(int j=(bin[0]+1)/2-(zero+1);j<=i-1;j++)
31                 sum+=c[i-1][j];
32         }
33         else
34             zero++;
35     }
36     return sum;
37 }
38 int main(int argc, char *argv[])
39 {
40     int a,b,sum=0;
41     for(int i=0;i<=33;i++)
42     {
43         for(int j=0;j<=i;j++)
44         {
45             if(!j||i==j)
46                 c[i][j]=1;
47             else
48                 c[i][j]=c[i-1][j-1]+c[i-1][j];
49         }
50     }
51     scanf("%d%d",&a,&b);
52     printf("%d\n",roun(b+1)-roun(a));
53     return 0;
54 }

 

转载于:https://www.cnblogs.com/huluxin/p/9749991.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值