poj3252 组合数学
生活随笔
收集整理的這篇文章主要介紹了
poj3252 组合数学
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意:給兩個數字a,b求出[a,b]中轉化成二進制后0的個數大于等于1的個數的數
例如1100轉化成10-11,100-111,1000-1011,1100。保證每個區段都有1打頭,然后有一段數字任選用組合數求;
代碼如下
#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; //轉化成二進制的位數while(n){a[o++] = n%2;n/=2;}int sum = 0; //ansint u = 0; //二進制前面1的個數-0的個數for(int i = o-2; i >= 0; i--){if(a[i] == 1){if(i >= u){for(int k = 0; k <= i; k++){ //1的個數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?
轉載于:https://www.cnblogs.com/icodefive/p/4234608.html
總結
以上是生活随笔為你收集整理的poj3252 组合数学的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MAC 升级到10.10(OS X Yo
- 下一篇: android.graphic.Path