定義好數為轉換為二進位制後,有至少三個連續的位相同的數,現在要求乙個範圍內的好數個數
對於50%測試,0 <= low <= up <= 100000。
我們可以用字首和來求,就把問題轉換為了前n個數中好數的個數
它讓我們求好數,但因為好數特別難求,所以我們可以求『壞數』,就是沒有連續三個位是一樣的數
我們先用數字dp求出多少位以什麼開頭的壞數總數
然後我們把他分位數小於n的位數的和等於n的位數的
小於的:
我們就可以直接用已經求出來的壞數總數,然後分為不同位數的直接加就行了
如1…1100100先分為1位,2位,3位,4位,5位,6位的型別
等於的:
就從大到小把1變成0,這樣就一定小於n了,然後分別計算
最後還要計算n
然後用n減去壞數的個數就得到了好數的個數了
#include
#include
#include
#define ll long long
using
namespace std;
ll a,b,s[40]
,f[40][
5][5
];ll js
(ll now)
}return sum;
}ll ans
(ll dep)
intmain()
scanf
("%lld %lld"
,&a,
&b);
printf
("%lld"
,ans
(b)-
ans(a-1)
);//字首和求職
}
JZOJ 數字遊戲 DP
小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,a3,an,然後給你m個回合的機會,每回合你可以從中選擇乙個數字擦去它,接著剩下來的每個數字ai都要遞減乙個值bi,即a1減掉b1,a2減掉b2,如此重複m個回合,所有你擦去的數字之和就是你所得的分數。小w和他的好朋友小y玩了這個遊戲,可是他發...
jzoj數字遊戲 貪心 DP
description 一行數字a1,a2,a3,an,有m個回合,每個回合必須從中選擇乙個數字擦去它,接著每個回合後剩下來的每個數字ai都要遞減乙個相應的值bi。如此重複m個回合,所有你擦去的數字之和就是你所得的分數。給出n,m,a數列和b數列,求所得的最多的分數。input 輸入檔案的第一行是乙...
DP 數字遊戲(jzoj 2131)
有n個數,每個數有相應的a ia i ai 和b ib i bi 當選了乙個數後結果加上a ia i ai 其他數分別減去他們自己的a ja j aj 現在讓你選m個數,結果最大是多少 3 310 20 30 4 5 6471 m n 2000 1 leqslant m leqslant n leq...