poj 3252 组合数

主要考察组合数知识,初始化的时候参考公式

首先先推个公式,就是长度为len的Round Numbers的个数。

长度为len,第一位肯定是1了。

那么后面剩下 len-1位。

如果len-1是偶数。

那么  C(len-1,(len-1)/2+1)+C(len-1,(len-1)/2+2)+````C(len-1,len-1)

=   ( 2^(len-1)-C(len-1,(len-1)/2) )/2;

如果len是奇数

那么就是 (  2^(len-1) )/2

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 const int maxn=35;
 9 int m,t;
10 int c[maxn][maxn];
11 int bit[maxn];
12 void init()     //初始化组合数
13 {
14     c[0][0]=c[1][0]=c[1][1]=1;
15     for(int i=2;i<=33;i++)
16     {
17         c[i][0]=1;
18         for(int j=1;j<i;j++)
19             c[i][j]=c[i-1][j]+c[i-1][j-1];
20         c[i][i]=1;
21     }
22 }
23 int calc(int n) //求小于等于n的round数的和
24 {
25     if(n<=1)    return 0;
26     int len=0;
27     while(n>0)  //求出该数的二进制表示
28     {
29         if(n&1) bit[len++]=1;
30         else bit[len++]=0;
31         n>>=1;
32     }
33     int ans=0;
34     for(int i=len-1;i>0;i--)    //求出长度小于len的round数的和
35     {
36         if(i%2==0)ans+=((1<<(i-1)))/2;
37         else  ans+=((1<<(i-1))-c[i-1][(i-1)/2])/2;
38     }
39     int c1=0,c0=0;
40     for(int i=0;i<len;i++)
41     {
42         if(bit[i]==0)    c0++;
43         else c1++;
44     }
45     if(c0>=c1)  ans++;      //该数本身是round数
46     c1=1;c0=0;
47     for(int i=len-2;i>=0;i--)    //注意计数是从零开始的
48     {
49         if(bit[i]==1)   //该位可以变成零
50         {
51             for(int j=i;j>=0&&j+c0+1>=i-j+c1;j--)    ans+=c[i][j];   //j是准备添加的0的数目
52             c1++;
53         }
54         else c0++;
55     }
56     return ans;
57 }
58 int main()
59 {
60     int i,j,k;
61     init();
62     int a,b;
63     //freopen("1.in","r",stdin);
64     while(scanf("%d%d",&a,&b)!=EOF)
65     {
66         printf("%d\n",calc(b)-calc(a-1));
67     }
68     return 0;
69 }
时间: 2024-10-19 12:14:16

poj 3252 组合数的相关文章

poj 3252 Round Numbers 【推导&#183;排列组合】

以sample为例子 [2,12]区间的RoundNumbers(简称RN)个数:Rn[2,12]=Rn[0,12]-Rn[0,1] 即:Rn[start,finish]=Rn[0,finish]-Rn[0,start-1] 所以关键是给定一个X,求出Rn[0,X] 现在假设X=10100100  这个X的二进制总共是8位,任何一个小于8位的二进制都小于X 第一部分,求出长度为[0,7]区间内的二进制是RoundNumber的个数  对于一个长度为Len的二进制(最高位为1),如何求出他的Rou

poj 3252 Round Numbers (组合数学)

链接 :poj 3252 题意:一个数转化成二进制之后,0的个数大于等于1的为round数, 给定一个区间[m,n],问这区间内有多少round数 分析:要求[m,n]间的的round数, 可以用[1,n+1)的个数减去[1,m)的个数, 对于比N小的round数的个数: 化为二进制的长度比N的长度小的数:如果长度为L,那么高位肯定是1, 然后枚举0的个数,利用组合数求即可 长度和N相等但比N小的数: 从高位开始枚举,若出现1,则将这位看作0,再枚举之后的低位,肯定是比原数小的 依次下去,注意统

POJ 3252 组合计数

Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9149 Accepted: 3248 Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors', 'Ro,

POJ 3252 Round Numbers 数学题解

Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors', 'Ro, Sham, Bo', and a host of other names) in order to make arbitrary decisions such as who gets

【POJ 3252】 Round Numbers

[POJ 3252] Round Numbers 组合数学里的题..在我飞的引导下走上了数位dp的不归路...这样算不算开挂....好羞涩 数位dp真的真的真的好好用!!! 数位dp真的真的真的好好用!!! 数位dp真的真的真的好好用!!! 重要的事说三遍 一入数位dp深似海 再也粗不来了... 用数位很好想--都不知道该怎么写题解... 代码如下: #include <iostream> #include <cstdio> #include <cstring> #de

poj 3252 Round Numbers(数学)

链接:http://poj.org/problem?id=3252 题意:一个数写成二进制,0不少于1就是round number,求给定区间内round number的个数. 分析:显然第一步转化为0到n的round number个数..设n写成二进制有len位,第一位取0时,后面只要满足0的个数要求就行了,不用考虑是否比n大..可以先预处理一下长度不大于len的round number个数,记做t[len],t[len]=t[len-1]+∑C(len-1  k) , (k=0,1,...,

POJ 3252 数位DP

链接: http://poj.org/problem?id=3252 题意: 给你一个区间l,r,求区间中有多少个数转化为二进制后1的个数大于等于0的个数 题解: 还是数位dp,不过多了前导0的判断 代码: 31 int a[40]; 32 int dp[40][80]; 33 34 int dfs(int pos, int sta, bool lead, bool limit) { 35 if (pos == -1) return sta >= 40; 36 if (!lead &&

POJ 3252 Round Numbers 数位dp(入门

题目链接:点击打开链接 题意: 给定一个区间,求区间内有多少个合法数(当这个数的二进制中0的个数>=1的个数称为合法数 二进制无前导0) 思路: cnt[i]表示二进制长度为i位(即最高位为1,其他位任意)时的合法数个数. sum[i] 就是二进制长度<=i位的合法数个数. 然后从最高位枚举到低位即可.维护当前0的个数. #include <cstdio> #include <algorithm> #include <cstring> #include &l

[ACM] POJ 3252 Round Numbers (一个区间内二进制中0的个数大于等于1的个数有多少个,组合)

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8590   Accepted: 3003 Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors',