花神的數論題 數字dp

2022-03-25 04:12:30 字數 1330 閱讀 5642

題目描述

設$sum(i)$表示$i$的二進位制表示中$1$的個數。

給出乙個正整數$n$,花神要問你:$\prod_^nsum(i)$。

資料範圍

對於$100$%的資料,$n\leq10^$

考慮每一位二進位制的拆解

#include #define mod (ll)10000007

using

namespace

std;

typedef

long

long

ll;const

int maxn=50+5

;ll n,a[maxn],ans=1

,cnt;

ll qpow(ll a,ll b)

return

res;

}int

main()

a[cnt]++;

for(int i=1;i<=49;i++) ans=ans*qpow(i,a[i])%mod;

printf(

"%lld\n

",ans);

return0;

}

二進位制位拆解

記憶化搜尋:

$10^$分解二進位制位最多有五十位,可以列舉一共有多少位有1,50次

$dp[i][j][k]$表示在當前無限制條件下,已經列舉到了第$i$位,有了$j$個1,求有$k$個1的方案數。

結束條件$j=k$時才$return 1$。

#include #define mod 10000007

using

namespace

std;

typedef

long

long

ll;int a[55

];ll n,dp[

55][55][55],ans[55

];ll qpow(ll x,ll y)

return

res;

}ll dfs(

int cnt,int flag,int now,int

k)

if(!flag) return dp[cnt][now][k]=res;

return

res;

}ll query(ll x)

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

}for(int i=1;i<=50;i++)

return

res;

}int

main()

dfs版

BZOJ 3209 花神的數論題 數字DP 數論

題目大意 令sum i 為i在二進位制下1的個數 求 1 i n sum i 一道很簡單的數字dp 首先我們打表打出組合數 然後利用數字dp統計出二進位制下1的個數為x的數的數量 最後輸出 1 x logn x ans x 即可 此題的坑在於這題的組合數和數字dp的結果都是指數 對指數取模不能直接取...

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

題解 數字dp的思想 列舉的是二進位制數 先預處理出所有i位二進位制數中,含j個1的數的個數,就是c i,j 然後就是從高位到低位,處理填0還是1的情況 填0 之後i 1位隨機填0 1 填1 緊接著的 n對應的二進位制數該位為0 的位只能填0 否則超過n 注意該演算法計數到的所有情況不含sum n ...

bzoj 3209 花神的數論題(數字dp)

time limit 10 sec memory limit 128 mb submit 980 solved 460 submit status discuss 背景眾所周知,花神多年來憑藉無邊的神力狂虐各大 oj oi cf tc 當然也包括 ch 啦。描述話說花神這天又來講課了。課後照例有超級...