BZOJ3209 花神的數論題(數字dp)

2021-06-28 12:46:11 字數 652 閱讀 8400

【題解】

數字dp的思想 

列舉的是二進位制數 先預處理出所有i位二進位制數中,含j個1的數的個數,就是c(i,j)

然後就是從高位到低位,處理填0還是1的情況 

填0:之後i-1位隨機填0/1

填1:緊接著的[n對應的二進位制數該位為0]的位只能填0(否則超過n) 

注意該演算法計數到的所有情況不含sum(n)!因此讀入時,n++

數字dp是不是基本都要預處理 = = 

#include#include#define mod 10000007

typedef unsigned long long ull;

ull c[65][65]=;

ull ksm(ull a,ull n)

int main()

{ ull n,t,ans=1;

int i,j,k=0,len=0;

scanf("%llu",&n);

n++;

for(i=0;i<64;i++)//預處理組合數

{c[i][0]=1;

for(j=1;j0;t=t>>1)

len++;

for(i=len;i>=1;i--)

if(n>>(i-1)&1)

{for(j=0;j

bzoj3209 花神的數論題

題意 求sum 1 sum 2 sum n 其中sum x 表示x的二進位制表達中1的數量。答案模10 7 7。n 10 15。考慮列舉sum x 的值為t,然後求有多少個不大於n的正整數的二進位制表達恰好有t個1,設這個答案為f t 這一部分可以用數字dp來實現。例如要求解1.12,可以將其分成1...

bzoj 3209 花神的數論題

設 sum i 表示 i 的二進位制表示中 1 的個數。給出乙個正整數 n 求 i 1ns um i 枚下1的個數,那麼題目就轉換成了1 n有多少個數的二進位制有x個一。這就很容易數字dp了。f i j 表示i位第一位為1,共j個一的數的數目,g i j 表示i位第一位為0,共j個一的數的數目。容易...

BZOJ3209 花神的數論題

bzoj3209 花神的數論題 背景眾所周知,花神多年來憑藉無邊的神力狂虐各大 oj oi cf tc 當然也包括 ch 啦。描述話說花神這天又來講課了。課後照例有超級難的神題啦 我等蒟蒻又遭殃了。花神的題目是這樣的 設 sum i 表示 i 的二進位制表示中 1 的個數。給出乙個正整數 n 花神要...