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 to be milked first.
They can‘t even flip a coin because it‘s so hard to toss using hooves.

They have thus resorted to "round number" matching. The first cow picks an integer less than two billion. The second cow does the same. If the numbers are both "round numbers", the first cow wins,

otherwise the second cow wins.

A positive integer N is said to be a "round number" if the binary representation of N has as many or more zeroes than it has ones. For example, the integer 9, when written in binary form, is 1001. 1001 has two zeroes and two ones; thus,
9 is a round number. The integer 26 is 11010 in binary; since it has two zeroes and three ones, it is not a round number.

Obviously, it takes cows a while to convert numbers to binary, so the winner takes a while to determine. Bessie wants to cheat and thinks she can do that if she knows how many "round numbers" are in a given range.

Help her by writing a program that tells how many round numbers appear in the inclusive range given by the input (1 ≤ Start < Finish ≤ 2,000,000,000).

Input

Line 1: Two space-separated integers, respectively Start and Finish.

Output

Line 1: A single integer that is the count of round numbers in the inclusive range Start..Finish

Sample Input

2 12

Sample Output

6

总体来说,十分困难的一道数学counting problem。

利用组合数学去做这些题目总是需要非常费力去总结规律的。

也许是数学思维还需要多锻炼吧。

具体是找出规律,按照二进制数位去数这样的题目,当然是不能模拟的。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <functional>
#include <bitset>
using namespace std;

int cTbl[33][33];

int calCombinate(int up, int down)
{
	down = min(down, up - down);
	int ans = 1;
	for (int i = 1; i <= down; i++)
	{
		ans *= (up - i + 1);
		ans /= i;
	}
	return ans;
}

void genTbl()
{
	cTbl[0][0] = 1;
	for (int i = 1; i < 33; i++)
	{
		cTbl[i][0] = 1;
		for (int j = 1; j <= i; j++)
		{
			cTbl[i][j] = calCombinate(i, j);
		}
	}
}

int calZeros(int n)
{
	bitset<33> bn = n;
	int len = 32;
	while (!bn[len]) len--;

	int ans = 0;
	for (int i = 1; i < len; i++)
	{
		for (int j = (i+2)>>1; j <= i; j++)
			ans += cTbl[i][j];
	}
	int zeros = 0, half = (len+2) >> 1;
	for (int i = len-1; i >= 0; i--)
	{
		if (bn[i])//前面选择好01了,改为为1,变为0,然后选择余下的0有多少个
		{
			for (int j = half-zeros-1; j <= i; j++)
			{
				if (j < 0) continue;
				ans += cTbl[i][j];
			}
		}
		else zeros++;
	}
	return ans;
}

int main()
{
	genTbl();
	int a, b;
	while (scanf("%d %d", &a, &b) != EOF)
	{
		printf("%d\n", calZeros(b+1) - calZeros(a));
	}
	return 0;
}

POJ 3252 Round Numbers 数学题解

时间: 2024-08-06 20:07:04

POJ 3252 Round Numbers 数学题解的相关文章

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 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

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12824   Accepted: 4946 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',

POJ 3252 —— Round Numbers

Round Numbers Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u 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, S

poj 3252 Round Numbers(数位DP)

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11003   Accepted: 4064 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',

POJ 3252 Round Numbers(数位dp&amp;amp;记忆化搜索)

题目链接:[kuangbin带你飞]专题十五 数位DP E - Round Numbers 题意 给定区间.求转化为二进制后当中0比1多或相等的数字的个数. 思路 将数字转化为二进制进行数位dp,由于一个二进制数的最高位必须为1.所以设置变量first记录前面位是否有1,若有1,则可随意放,否则,仅仅可放1. 同一时候.上面的推断决定了搜索时len的大小与二进制本身的长度不一定相等,所以需两个变量对1和0的个数进行记录. 用dp[a][b][c]保存长度a,b个0,c个1的数字个数.记忆化搜索.

POJ 3252 Round Numbers(组合数学)

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10223   Accepted: 3726 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',

POJ 3252 Round Numbers 组合数学

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13381   Accepted: 5208 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