/*
* 題目大意:
* 求給定區間[x,y]中滿足下列條件的整數個數:這個數恰好等於k個互不相等的b的整
* 數次冪之和。例如,設x=15,y=20,k=2,b=2,則有且僅有下列三個數滿足題意:
* 17 = 2^4+2^0
* 18 = 2^4+2^1
* 20 = 2^4+2^2
* 輸入:第一行包含兩個整數x和y。接下來兩行包含整數k和b。
* 輸出:只包含乙個整數,表示滿足條件的數的個數
* 資料規模:1 ≤ x ≤ y ≤ 2^31−1,1 ≤ k ≤ 20, 2 ≤ b ≤ 10
* */
/* * 分析:
* 所求的數為互不相等的冪之和,亦即其b進製表示的各位數字都只能是0和1。因此,
* 我們只需討論二進位制的情況,其他進製都可以轉化為二進位制求解
* 很顯然,資料範圍較大,不可能採用列舉法,演算法複雜度必須是log(n)級別,因此我們要從數字上下手
* 本題區間滿足區間減法,因此可以進一步簡化問題:令count[i..j]表示[i..j]區間內合法數
* 的個數,則count[i..j]=count[0..j]-count[0..i-1]。換句話說,給定n,我們只需求出從0到n
* 有多少個符合條件的數。
* ** 設f[i,j]表示所求,則分別統計左右子樹內符合條件數的個數,有f[i,j]=f[i-1,j]+f[i-1,j-1]
* 這樣,我們就得出了詢問的演算法:首先預處理f,然後對於輸入n,我們在假想的完全
* 二叉樹中,從根走到n所在的葉子,每次向右轉時統計左子樹內數的個數。
*/#include using namespace std;
unsigned int c[32][32] = ;
int slove( int n, int b, int k)
, len = 0, t = n;
while ( t )
int sum = 0, tot = 0;
for (int i = len-1; i >= 0; --i)
else
if ( bits[i] == 1)
if( ++tot > k )
break;
}if( !i && tot == k )
sum++;
} return sum;
}int main ()
} while ( cin>>x>>y>>k>>b )
//std::cout << "hello, world!" << std::endl;
return 0;
}
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...
《動態規劃》 ACM 動態規劃例題詳解
描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...