題目描述
設$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 10000007dfs版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()
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 啦。描述話說花神這天又來講課了。課後照例有超級...