今日熱文:『題解』BZOJ3462 DZY Loves Math II
時間:2023-06-25 07:18:34
(資料圖片)
前言
沒啥前言,擺了擺了。
題面長這個樣子
思路
沒啥思路,擺了擺了。這題總的來說挺難想的,思考過程比較繁瑣,我也就不辭辛勞列舉一下。
顯然,條件 \(2\) 和條件 \(3\) 很好說,放一邊。
我們設一個質數數列 \(\{p_k\}\) ,假定這些質數是由 \(S\) 分解坤坤數
質因數得到的,若要滿足條件 \(4\) (即 \(\mathbb{lcm}\{p_k\} = S\) ) ,則需要滿足 \(\{p_k\}\) 中的元素兩兩互不相等,否則無解。\(\\\) 證明顯然。 \(\\\) 設 \(sum = \sum_{i = 1}^{k}{p_i}\) ,我們討論另一種無解的情況。當 \(n < sum\) 時無解。\(\\\) 證明如下:\(\\\) 因為 \(n\) 一定由 \(\{p_k\}\) 中的全部元素組成,當然,每個元素可以有多個。若 \(n < sum\) ,則 \(n\) 一定不能由 \(\{p_k\}\) 中的全部元素組成(因為在這種情況下 \(sum = \sum_{i = 1}^{k}{p_i} > n\) ,就算每個元素只選一個,這些選的元素相加也會比 \(n\) 大),所以便不能滿足條件 \(4\) 。下面我們只考慮有解的情況。乍一看,這個題很像多重背包。\(\\\) 你說得對,但是這題數據范圍很大,只用多重背包會炸掉。\(\\\) 所以,我們便要采取一些優化手段。\(\\\) 設 \(S = p_i \times k_i\) , 則 \(k_i\) 的含義便是除了坤坤子 \(p_i\) 外所有坤坤子的乘積。\(\\\) 設 \(n = \sum_{i = 1}^{k}{p_i \times c_i}\) ,\(c_i\) 是坤坤子 \(p_i\) 出現的個數,對于每一項 \(p_i \times c_i\) ,我們可以寫成 \(p_i \times (x_i \times k_i + y_i),(y_i < k_i)\) ,拆開括號得 \(p_i \times k_i \times x_i + p_i \times y_i\) ,即 \(S \times x_i + p_i \times y_i , (p_i \times y_i < S)\) 。把每一項加在一起便可得 \(n = S \times \sum_{i = 1}^{k}{x_i} + \sum_{i = 1}^{k}{p_i \times y_i} , (\sum_{i = 1}^{k}{p_i \times y_i} < k \times S)\) 。簡化一下(就不設了,知道什么跟什么對應就行)可得 \(n = a \times S + b,(b < k \times S)\) 。\(\\\) 有了這個式子(別管為什么能這么得到這個式子),我們便用加號前面的跑組合數,加號后面的跑
多重背包就行。組合數怎么跑?對于 \(a \times S\) ,因為 \(\{p_k\}\) 中每一個元素都是 \(S\) 的約數,所以每個 \(S\) 都可以用任何一個 \(p_i\) 表示。因為有 \(k\) 個坤坤數,所以 \(S\) 最多能表示成 \(k\) 種形式(有的可以不用表示),一共有 \(a\) 個這樣的數,所以轉化一下就是插板法求組合數,(根據條件 \(3\) 可知是有序的)把 \(a\) 個數分成 \(k - 1\) 個可空的部分,答案顯然是 \(\mathrm{C}_{a + k - 1}^{k - 1}\)。
背包怎么跑?我們不知道 \(a \times S\) 和 \(b\) 中是否都存在 \(p_i\) ,所以我們用 \(2\) 的 \(sum\) ,讓 \(b = b - sum\) ,保證每一個 \(p_i\) 都存在,然后我們就可以跑完全背包了。這題讓求方案數,
稍微改一下就行了。我們先枚舉每一個坤坤子 \(p_i\) ,先都加上,然后再把多的減去即可(這里我犯懶了Orz)。
完結撒代碼
#include #define LL long longusing namespace std;const int MOD(1e9 + 7), maxn(2000005);inline LL read() { LL f(1), x(0); char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == "-") f = -1; for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c & 15); return f * x;}LL s, q, n, cnt, sum, M, ans;LL inv[maxn], prime[maxn], v[10], dp[7 * maxn];void DP() { dp[0] = 1; for (int i = 1; i <= cnt; ++i) { for (int j = 0; j + v[i] <= M; ++j) { if (dp[j]) dp[j + v[i]] = (dp[j] + dp[j + v[i]] + MOD) % MOD; } for (int j = M - s; j >= 0; --j) { dp[j + s] = (dp[j + s] - dp[j] + MOD) % MOD; } }}bool divide(LL n) { LL x = n; for (int i = 2; i <= sqrt(x); ++i) { if (!(x % i)) { v[++cnt] = i; sum += i; } while (!(x % i)) { ++prime[i]; if (prime[i] == 2) return false; x /= i; } } if (x > 1) { ++prime[x]; v[++cnt] = x; sum += x; } return true;}LL QuickPow(LL a, LL b, LL p) { LL res(1); for (; b; b >>= 1) { if (b & 1) res = res * a % p; a = a * a % p; } return res % p;}int main() { s = read(), q = read(); if (!divide(s)) { while (q--) { n = read(); printf("0\n"); } return 0; } M = cnt * s; DP(); inv[1] = 1; for (int i = 2; i <= 8; ++i) { inv[i] = inv[i - 1] % MOD * QuickPow(i, MOD - 2, MOD) % MOD; } while (q--) { n = read(); if (n < sum) { printf("0\n"); continue; } n -= sum; for (int i = 0; i < cnt && i <= n / s; ++i) { LL a = n / s - i; LL b = n % s + i * s; int res1(1), res2(0); res1 = inv[cnt - 1] % MOD; for (int j = 1; j < cnt; ++j) { res1 = res1 * ((a + j) % MOD) % MOD; } res1 %= MOD; res2 = res1 % MOD * dp[b] % MOD; ans = (ans + res2) % MOD; } ans = (ans % MOD + MOD) % MOD; printf("%lld\n", ans); ans = 0; }}
相關稿件
今日熱文:『題解』BZOJ3462 DZY Loves Math II
今日視點:天通股份(600330):材料與設備共舉 研發不輟
何雄會見特斯拉汽車(北京)有限公司客人 拓展合作領域豐富合作內容 提供更多新產品新技術新服務
從批發市場到高精尖產業園區,北京低效樓宇加速“改頭換面”|當前短訊
世界熱議:推動整改復耕須避免“一刀切” “水稻上山”引熱議 農業部門相關負責人回應網民關切
【全球新視野】創維EV6 II汽車上市:CLTC續航最高620公里,15.68萬元起
強鏈延鏈贏得發展主動權——訪恒力集團董事長、總裁陳建華-每日速訊
湖北經濟學院法商學院2023屆畢業生齊聚一堂參加畢業典禮_世界快看
天天視訊!【鄉村振興】年產值達2.4億!子洲黃芪種植面積達15萬畝
2023商業物業市場開發現狀分析 商業物業行業發展空間巨大_每日動態
【房地產開發】房地產/行業深度:更新改造、人均居住面積改善驅動未來住宅需求-全球簡訊