洛谷 P4317 花神的數論題(數字dp)

2021-10-19 09:13:03 字數 1380 閱讀 4274

題目背景

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

題目描述

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

i=1n

​ sum(i) ,也就是 \text(1)\sim\text(n)sum(1)∼sum(n) 的乘積。

輸入格式

乙個正整數 nn。

輸出格式

乙個數,答案模 1000000710000007 的值。

輸入輸出樣例

輸入 #1 複製

3輸出 #1 複製

2說明/提示

對於 100%100% 的資料,1\le n\le 10^1≤n≤1015。

列舉所有可能的1的個數,即[1,k](k是n的二進位制位數),這道題不是把數字轉化為十進位制,而是轉化為二進位制,計算出1的個數為fx的數字個數,再通過快速冪計算。

10^15轉化為二進位制大概是50,但是寫**的時候陣列要比50大一點。

注意:dfs求指數的時候不能對mod取模。

#include

#define ll long long

using

namespace std;

const

int n =

1e5+10;

const

int mod =

10000007

;int a[55]

,fx;

ll dp[55]

[55];

ll dfs

(int pos,

int flag,

int sum)if(

!flag&&dp[pos]

[sum]!=-

1)return dp[pos]

[sum]

;int up=flag?a[pos]:1

; ll ans=0;

for(

int i=

0;i<=up;i++)if

(!flag) dp[pos]

[sum]

=ans;

return ans;

}ll poww

(int p,ll q)

return ans;

}ll solve

(ll x)

ll ans=1;

for(

int i=

1;i<=k;i++

)return ans;

}int

main()

洛谷P4317 花神的數論題

話說花神這天又來講課了。課後照例有超級難的神題啦 我等蒟蒻又遭殃了。花神的題目是這樣的 設 text i 表示 i 的二進位制表示中 1 的個數。給出乙個正整數 n 花神要問你 prod text i 也就是 text 1 sim text n 的乘積。設 f i 為有 i 個一的方案數。可以用組合...

洛谷 P4317 花神的數論題(數字dp)

用數字dp計算有 n以內的數字 有k 個 1的數字有多少個,然後快速冪。數字dp 直接在二進位制位上進行列舉。坑點 1e7 7 不是素數,但數字dp 內部無須取模數值不會爆long long include using namespace std typedef long long ll const...

P4317 花神的數論題

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