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

2021-08-16 20:09:46 字數 2512 閱讀 6312

題目鏈結

題目描述: 設s

um(i

) sum

(i)表示

i i

的二進位制表示中1的個數 求∏

i=1n

sum(

i)' role="presentation" style="position: relative;">∏ni

=1su

m(i)

∏i=1

nsum

(i)

分析:

1015

<250

1015

<250

顯然sum的最大值為49

直接計算su

m(i)

s um

(i

)比較麻煩,我們可以考慮計算有多少數的su

m值=x

s um

值=

x(列舉

x x

) (有點反演的感覺)

一開始我設計了乙個比較複雜的狀態 f[

i][j

][0/

1][0

/1]' role="presentation" style="position: relative;">f[i

][j]

[0/1

][0/

1]f[

i][j

][0/

1][0

/1]:表示第

i i

位,有j' role="presentation" style="position: relative;">j

j個1,這一位是0還是1,卡不卡上界

寫完之後拍了拍,發現小資料還是可以的,大資料不知道為什麼wa掉了

(倒是可以用來拍一拍小資料)

if (n&(1ll<<_)) f[1][1][1][1]=1;

f[1][0][0][0]=1;

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

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

for (int k=0;k<=1;k++)

for (int s=0;s<=1;s++)

if (f[i][j][k][s]) else

}else else

}}

新狀態: f[

i][j

] f[i

][j]

表示i i

位長的數字,其中有

j' role="presentation" style="position: relative;">j

j個1的數字個數

狀態轉移方程:f[

i][j

]=f[

i−1]

[j]+

f[i−

1][j

−1] f[i

][j]

=f[i

−1][

j]+f

[i−1

][j−

1]

什麼,這麼簡單?

i i

位長的數字,一定從i−

1' role="presentation" style="position: relative;">i−1

i−1位的數字轉移而來 而i

i

位的數字轉移有兩種,即在i−

1' role="presentation" style="position: relative;">i−1

i−1位的數字後加

0 0

或者加1' role="presentation" style="position: relative;">1

1初始化:f[

1…n]

[0]=

1 f[1

…n][

0]=1

(實際上就是在

j j

個位置上選擇

i' role="presentation" style="position: relative;">i

i個位置放1)

#include

#include

#include

#define ll long long

using

namespace

std;

const ll p=1e7+7;

ll f[65][65],n;

int _,a[65];

ll ksm(ll a,ll b)

return t%p;

}void prepare()

}ll solve(int x)

if (x<0) break;

}return sum;

}int main()

ll ans=1;

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

ans=(ans*ksm(i,solve(i))%p)%p;

printf("%lld\n",ans);

return

0;}

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 花神要...