bzoj3209 花神的數學題

2022-04-08 03:20:11 字數 1197 閱讀 2544

背景

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

描述話說花神這天又來講課了。課後照例有超級難的神題啦…… 我等蒟蒻又遭殃了。

花神的題目是這樣的

設 sum(i) 表示 i 的二進位制表示中 1 的個數。給出乙個正整數 n ,花神要問你

派(sum(i)),也就是 sum(1)—sum(n) 的乘積。

乙個正整數 n。

乙個數,答案模 10000007 的值。

樣例輸入一

3樣例輸出一

2對於樣例一,1*1*2=2;

資料範圍與約定

對於 100% 的資料,n≤10^15

原創 memphis

數字dp+數論

令f[x]表示sum[i]=x的i的個數,則最終答案等於(1^f[1])*(2^f[2])*(3^f[3])*……

因為底數的範圍很小,而10000007=941*10627,所以底數和10000007一定互質,根據尤拉定理,只要將指數對phi(10000007)=9988440取模就可以了。

那現在問題就是如何求f[x]。

從高位向低位進行數字dp,具體方法見程式。

為什麼各種各樣的dp自己都想不出來...(╯‵□′)╯︵┻━┻

#include

#include

#include

#include

#include

#include

#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define mod 10000007

#define phi 9988440

using namespace std;

ll n,ans=1,c[60][60],f[60];

inline ll read()

while (ch>='0'&&ch>='9')

return x*f;

}inline void dp(ll x)

int main()

dp(n+1);

f(i,1,50) ans=ans*getpow(i,f[i])%mod;

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

}

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