題意:給定 m, k,求乙個數n,使得 n+1,n+2, .....,n*2 這些數中有m個數的二進位制表示含有k個1
思路:n的範圍為1e18次方,然後又沒有好的公式來求
所以可以試一下二分+數字dp判斷
yy了下,要是mid求得的 個數小於m,則mid應該變大,反之則要變小。。。。
寫了下真的可以,1a
ac**如下:
#include #include #include #include using namespace std;
int digit[100], tot;
__int64 dp[100][100][2];
__int64 m, k;
__int64 dfs( int pos, int presum, bool st )else
}if( !st && dp[pos][presum][st] != -1 )
__int64 ans = 0;
int endd = st ? digit[pos] : 1;
for( int i = 0; i <= endd; i++ )
return dp[pos][presum][st] = ans;
}__int64 solve( __int64 n )
memset( dp, -1, sizeof( dp ) );
return dfs( tot - 1, 0, true );
}int main()else if( t < m )else
}return 0;
}
HDU 3271 SNIBB 數字DP 二分
比較裸的數字dp,需要注意的就是二分時一定要寫成 mid long long l long long r 1 不然會溢位導致超時的,被這個坑了好一會兒。還有就是題目並沒有說y一定大於x,所以需要判斷一下。include include include include include include ...
咕咕東的奇妙序列 二分 數字模擬
poj 1019 number sequence 題目給出一種序列表示方式,可以表示為 1 12 123 1234 12345678910 序列不帶空格 也就是說序列可被分組,第 i 組包含的是1到 i 的所有數字。題目給出多個詢問要求每次得到序列中第 k 位的數字。注意 k 要能取到 10 18....
cf 474E 線段樹 dp 離散化後二分查詢
題意 給你n個柱子,每個柱子都有乙個高度,你從第乙個柱子開始跳往後跳,後面的柱子要滿足 hi hj d才可以跳上去,問最多跳多少步,並且輸出一種跳法,從小到大輸出柱子號。思路 真肯定是個dp,而且思路很簡單 轉移方程 dp i max dp j 1,hi hj d 但是n的範圍是10 5,那麼你每次...