poj3252 组合数学
生活随笔
收集整理的這篇文章主要介紹了
poj3252 组合数学
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目大意:給兩個數(shù)字a,b求出[a,b]中轉(zhuǎn)化成二進制后0的個數(shù)大于等于1的個數(shù)的數(shù)
例如1100轉(zhuǎn)化成10-11,100-111,1000-1011,1100。保證每個區(qū)段都有1打頭,然后有一段數(shù)字任選用組合數(shù)求;
代碼如下
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; int a[40]; int c[50][50]; void table() {int i,j;for(i=0;i<=32;i++){for(j=0;j<=i;j++){if(!j||i==j)c[i][j]=1;elsec[i][j]=c[i-1][j-1]+c[i-1][j];}}return; } int sum(int n){if(n == 0)return 0;int o = 0; //轉(zhuǎn)化成二進制的位數(shù)while(n){a[o++] = n%2;n/=2;}int sum = 0; //ansint u = 0; //二進制前面1的個數(shù)-0的個數(shù)for(int i = o-2; i >= 0; i--){if(a[i] == 1){if(i >= u){for(int k = 0; k <= i; k++){ //1的個數(shù)if(k + u <= i - k){//printf("%d %d %d\n", i, k, c[i][k]);sum += c[i][k];}}}u++;}else u--;}//printf("%d %d \n", u, o);u++;if(u <= 0){sum ++;}for(int i = 1; i < o-1; i++){for(int k = 0; k <= i; k++){if(1+k <= i-k){sum += c[i][k];}}}return sum; } int main(){int a, b;table();while(scanf("%d%d", &a, &b)!=EOF){printf("%d\n",sum(b) - sum(a-1));} } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/icodefive/p/4234608.html
總結(jié)
以上是生活随笔為你收集整理的poj3252 组合数学的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MAC 升级到10.10(OS X Yo
- 下一篇: android.graphic.Path