Luogu4317 花神的數論題

2022-05-11 04:04:23 字數 1726 閱讀 2054

思維僵化不會寫題了qaq

problem

眾所周知,花神多年來憑藉無邊的神力狂虐各大 oj、oi、cf、tc …… 當然也包括 ch 啦。

題目描述

話說花神這天又來講課了。課後照例有超級難的神題啦…… 我等蒟蒻又遭殃了。 花神的題目是這樣的:設 \(sum(i)\) 表示 \(i\) 的二進位制表示中 \(1\) 的個數。給出乙個正整數 \(n\) ,花神要問你 \(\prod_^nsum(i)\) ,也就是\(sum(1)∼sum(n)\)的乘積。

乙個正整數 \(n\)。

乙個數,答案模 \(10000007\) 的值。

3
2
對於 \(100%\) 的資料,\(n≤10^\)

位數計算顯然可以用數字dp來搞

有一位神仙曾經說過

當你不會寫dp的時候,你就可以先寫乙個暴搜,然後再改成記搜 ——神仙

一語點醒夢中人,如雷貫耳(霧)

於是我們考慮按位數從高到低暴搜,並且記錄\(1\)的個數。

特別地,我們令\(sum(0)=1\)

然後加上記憶化就完事了

#include #include #include #include #include #include #define maxb 69

using namespace std;

typedef long long ll;

const ll mod=10000007;

ll n;

ll lim[maxb],len;

ll dp[maxb][maxb];

ll search(ll pos,ll cnt,bool limit)

int main()

printf("%lld",search(len,0,1));

return 0;

}

我們可以換個思路

我們可以通過數字dp求出在\([1,n]\)的所有數中,二進位制下\(1\)的個數為\(1,2,3,\dots,len\)的數的個數

然後使用快速冪即可求出答案

於是\(dp[i][j]\)表示列舉到第\(i\)位,前\(i\)位已經有\(j\)個\(1\)的答案個數

然後可以愉快地套模板辣

#include #include #include #include #include #include #define maxb 69

using namespace std;

typedef long long ll;

const ll mod=10000007;

ll n;

ll lim[maxb],len;

ll dp[maxb][maxb],cnts[maxb],ans=1;

ll search(ll cur,ll pos,ll cnt,bool limit)

ll fastpow(ll a,ll b)

return re;

}int main()

for(register ll i=1;i<=len;++i)

for(register int i=1;i<=len;++i)

ans=ans*fastpow(i,cnts[i])%mod;

printf("%lld",ans);

return 0;

}

P4317 花神的數論題

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

luoguP4317 花神的數論題 數字dp

這道題細節並不算太多,但是求方案數的時候一定不要亂取模!如果非要取模的話也要遵循尤拉定理.code include define n 57 define ll long long define mod 10000007 define setio s freopen s in r stdin usin...

洛谷 4317 花神的數論題 數字DP

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