思維僵化不會寫題了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...