bzoj3209 花神的數論題 數字DP

2021-08-04 07:33:18 字數 936 閱讀 6309

一開始想的是先預處理出n位的答案,因為假設當前給出的數x有y位,那麼y-1位的答案是固定的,我只要處理y位的答案就可以了,問題是這樣太複雜。。。

設f[i][j]表示i位有j個1的答案,那麼明顯有f[i][j]=f[i-1][j]+f[i-1][j-1],表示第i位選0或1.

然後最後統計一下答案,就是每一種出現了多少次。。

其實挺簡單的,基本想出來了,但是數字dp不熟,想的複雜了。

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

using

namespace

std;

const

int n=1e5+5;

const

int mo=10000007;

typedef

long

long ll;

ll n;

ll sum[100],f[100][100],g[100];

int wei[n];

int tot;

ll ans;

inline

void pre()

}ll solve(int x)

if (x<0)break;

}return sum;

} ll pow(ll a,ll b)

return ret;

}int main()

ans=1ll;

fo(i,1,tot)

ans=ans*pow(i,solve(i))%mo;

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

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