poj 3252 數字dp 數字統計)

2021-06-28 11:46:33 字數 1711 閱讀 9918

就是統計每個數不算本身的round數,具體解法如下

前前後後做過三遍,每一次都wa了好多次.........

dp解法:

#include #include #include #include #define max 40

using namespace std;

typedef int ll;

ll dp[max][max];

void pre ( )

ll calc ( ll n )

else cnt--;

}for ( int i = temp-1 ; i >= 0 ; i-- )

return res;

}int main ( )

}

排列組合解法:

#include #include using namespace std;

int c[40][40],b[40]; //注意啊,陣列還是要取大些好啊,更大的空間總不會出錯的,謹記//

//此函式求排列組合c(n,m),即求從m件物品中取n件有多少中取法//

void c()

//此函式求小於n的數中有多少round number//

int round(int n)

//求n二進位制//

for(i=1;i=0;i--) //計算位數為len的數中有多少小於n的round number,方法見上//

}else zero++; //zero記錄在搜尋過程中,已發現的0的個數//

}return ans;

}int main()

排列組合另一種寫法:

#include #include #include #include #include using namespace std;

int a ,b ;

int s1[40], s2[40];

int cnt1 = 0 , cnt2 = 0 ;

long long c ( long long index , long long bottom )

int c[40][40];

int ans = 0;

void init ( )

if ( zero >= one ) ans++;

while ( b )

c[0][0] = 1;

for ( int i = 1 ; i <= 35 ; i ++ )

for ( int j = 0 ; j <= i ; j ++ )

}int solve ( )

// cout << sum1 << endl;

zero = 0 , one = 1;

for ( int i = cnt2-1 ; i > 0 ; i -- )

else zero++;

}if (zero >=one ) sum2++;

// if ( one == 1 ) sum2++;

for ( int i = cnt2 - 2 ; i >= 0 ; i -- )

//cout << sum2 << endl;

return sum2 - sum1 + ans ;

}int main ( )

poj3252(數字dp)(模板)

題意 求 l,r 之間的round number數,rn數即化為二進位制後0的個數不少於1的個數的數。思路 之前用組合數求寫過,最近學數字dp,又用數字dp來寫一次。用dp pos n0 n1 表示長為pos 1的數 我從0開始定義的 之前已經有n0個0和n1個1的前提下rn數有多少,用lead表示...

poj3252(排列組合計數,數字計數)

translation 給出兩個數,求這兩個數形成的閉區間內round number的個數。乙個數轉換成二進位制的時候其中0的個數比1多的 或者相等的稱為round number。solution 排列組合。要求閉區間內的round number個數,只需要求出0 s的個數和0 t的個數,將二者相減...

poj3252 組合數學

題意 給出乙個範圍,然後問這個範圍內有幾個是round number round number也就是轉化二進位制後,的個數大於等於 的個數 思路 這是乙個組合計數的問題 我們拿乙個二進位制長度為 的數舉例子 如果長度為 那麼所有長度為 以下的數字,肯定都是在範圍內的,那麼我們就要找出所有符合條件的數...