柳丽琴 發表於 2026-4-18 17:23:00

poj1845 sumdiv 题解

<h1 id="poj1845-sumdiv-题解">poj1845 sumdiv 题解</h1>
<p>Emmm...<s>并非题解</s></p>
<p><s>其实是边想边写现编的</s></p>
<h2 id="先审题">先审题:</h2>
<blockquote>
<p>考虑两个自然数 A 和 B。令 S 为$ A^B $的所有自然因子之和。确定 S 除以 9901 的余数.</p>
<p>eg. <span class="math inline">\(2^3 = 8\)</span>。 8 的自然因子是:1、2、4、8。它们的和是 15。 15 除以 9901 的余数是 15(输出值)。</p>
</blockquote>
<p>啊,好简洁的题面<s>像我的大脑一样</s>!</p>
<p>可以肯定的,<span class="math inline">\(A\)</span>的因子一定是<span class="math inline">\(A^B\)</span>的因子<s>依旧废话</s></p>
<p>而且我们会发现,<span class="math inline">\(A^B\)</span>的质因子一定与A的质因子完全相同。</p>
<p><strong>很简单吧</strong> <s>谁问你了</s></p>
<hr>
<h2 id="思路">思路</h2>
<p>这时候,可以想到:(敲黑板,这是重点/)</p>
<p>对 <em><strong>A</strong></em> 进行 <strong>唯一分解</strong></p>
<p></p><div class="math display">\[\large A = \prod _{i=1}^{k}{(P_i^{e_i})}
\]</div><p></p><p><s>还是拆开好看:</s></p>
<p></p><div class="math display">\[\large A= P_1^{e_1} \times P_2^{e_2} \times ... \times P_k^{e_k}
\]</div><p></p><p>——其中<span class="math inline">\(P_i\)</span> 表示A的质因子,<span class="math inline">\(e_i\)</span>表示该质因子的次数。</p>
<p>那<span class="math inline">\(A^B\)</span>就是给每个<span class="math inline">\(e_i\)</span>乘上一个B就好了。</p>
<p><s>应该没人不知道这个吧</s></p>
<p>很显然地,A的 <strong>因子</strong> 就是一个x,使得:</p>
<p></p><div class="math display">\[\large x= P_1^{v_1} \times P_2^{v_2} \times ... \times P_k^{v_k}
\]</div><p></p><p>其中<span class="math inline">\(v_i &lt; e_i\)</span>.</p>
<p>Emmm...还是不好求嘞...</p>
<hr>
<h2 id="求解">求解</h2>
<p>题目要求我们求所有x的和,</p>
<p>每个<span class="math inline">\(P_i\)</span>会被算:</p>
<p></p><div class="math display">\[\tag {1} 1+P_i^1 + P_i^2 + P_i^3 + ... + P_i^{e_i}
\]</div><p></p><p>引入一个另外的一次质因子<span class="math inline">\(P_j\)</span>, 与上面组合,答案就是:</p>
<p></p><div class="math display">\[\tag {2} 1 \times P_j + P_i^1 \times P_j + P_i^2 \times P_j + ...
\]</div><p></p><p>可以发现,<span class="math inline">\((2)=(1)\times P_j\)</span>.</p>
<p>那么多次的<span class="math inline">\(P_j\)</span>就是:</p>
<p></p><div class="math display">\[(1) + (1) \times P_j^1 + (1) \times P_j^2 +...(1) \times P_j^{e_j}
\]</div><p></p><p><em>嘿,您猜怎么着,</em> 咱把这 <em>(1)</em> 一提:</p>
<p></p><div class="math display">\[(1) \times (1+P_j^1+P_j^2+P_j^3+...+P_j^{e_j})
\]</div><p></p><p><em>诶呦喂,瞧瞧,我是不是在哪遇见过您?awa</em></p>
<p><strong>这就是变了个样的 (1) 啊!</strong></p>
<p><s>噫嘘兮,情乎喜哉!数论之易,易于切水题。</s></p>
<p>很好,我们只要求每个<span class="math inline">\(P_i\)</span>所对应的(i),对其求积就可以了。</p>
<p>应该吧QAQ</p>
<hr>
<h2 id="拓展">拓展</h2>
<p>没想到吧,这篇题解还有拓展awa</p>
<blockquote>
<p>注意:</p>
<p></p><div class="math display">\[(I) = 1+P_i^1 + P_i^2 + P_i^3 + ... + P_i^{e_i}
\]</div><p></p></blockquote>
<p>有没有发现什么端倪?</p>
<p><strong>oi,这不是个等比数列吗</strong></p>
<hr>
<blockquote>
<details>
<summary> 这里是错解,之前没看就发出来也许干扰了大家的思路,万分抱歉orz</summary>
<p></p><div class="math display">\[\tag{1} (I) = 1+P_i^1 + P_i^2 + P_i^3 + ... + P_i^{e_i}
\]</div><p></p><p></p><div class="math display">\[\tag{2} P_i \times (I) = P_i^1 + P_i^2 + P_i^3 + ... + P_i^{e_i}+P_i^{e_i+1}
\]</div><p></p><p>(2)-(1),得</p>
<p></p><div class="math display">\[(P_i-1) \times (I) =P_i^{e_i+1}-1
\]</div><p></p><p>那么有</p>
<p></p><div class="math display">\[(I)=\frac{P_i^{e_i+1}-1}{P_i-1}
\]</div><p></p><p>...<s>太丑了吧</s></p>
<p>虽然丑,但它好求啊,这不比一个一个枚举快多了qwq</p>
<p>不过...这个式子必须用 <strong>乘法逆元</strong> 二次化简再取模,不然求得解是错的 <strong>(原因:模运算不具有同除性)</strong></p>
<p>我这个蒟蒻没学过就不在这里做洋相了</p>
<p>所以这是一个错解!QAQ</p>
</details>
</blockquote>
<hr>
<p>下面是正解</p>
<p>既然普通的等比数列求法不成立, 那么我们就试一些 <em>不同寻常</em> 的解法</p>
<p>观察等比数列结构:</p>
<blockquote>
<p><span class="math inline">\(\large S=1+P_i^1+P_i^2+P_i^3+...P_i^{e_i}\)</span></p>
</blockquote>
<p><strong>其实能用分治!</strong></p>
<p>当<span class="math inline">\(e_i\)</span>是奇数时,以5为例:<br>
<span class="math inline">\(\large S   =1+P_i^1+P_i^2+P_i^3+P_i^4+P_i^5\)</span></p>
<p><span class="math inline">\(\large \quad = (1+P_i^1+P_i^2) +P_i^3 \times (1+P_i^1+P_i^2)\)</span></p>
<p><span class="math inline">\(\large \quad = (1+P_i^3)\times (1+P_i^1+P_i^2)\)</span></p>
<p><span class="math inline">\(\large \quad = (1+P_i^{\frac{e_i}{2}+1})\times (1+P_i^1+...+P_i^{\frac{e_i}{2}})\)</span></p>
<p>当<span class="math inline">\(e_i\)</span>是偶数时,以4为例:</p>
<p><span class="math inline">\(\large S   =1+P_i^1+P_i^2+P_i^3+P_i^4\)</span></p>
<p><span class="math inline">\(\large \quad = (1+P_i^1)+P_i^2 +P_i^3 \times (1+P_i^1)\)</span></p>
<p><span class="math inline">\(\large \quad = (1+P_i^3)\times (1+P_i^1)+P_i^2\)</span></p>
<p><span class="math inline">\(\large \quad = (1+P_i^{\frac{e_i}{2}+1})\times (1+P_i^1+...+P_i^{\frac{e_i}{2}-1})+P_i^{\frac{e_i}{2}}\)</span></p>
<p>然后我们对第二个单项式递归继续求解即可,</p>
<p>此时我们就能放心大胆地取模哩~</p>
<p>好不容易打了一下午的题解,浅浅要个赞不过分吧qwq</p>
<h2 id="代码部分">代码部分</h2>
<p>.</p>
<p>.</p>
<p>.</p>
<p>.</p>
<p>.</p>
<p>.</p>
<p>.</p>
<p>.</p>
<p>.</p>
<p>自己写awa</p>
<h1 id="特别鸣谢">特别鸣谢</h1>
<p>教练</p>
<p>劳什子</p>
<p><em><strong>完结撒花✿ヽ(^ ▽^)ノ✿✿</strong></em></p><br><br>
来源:https://www.cnblogs.com/cao2333/p/19888619

MiniMax 發表於 2026-5-9 17:43:59

哇,楼主辛苦了!这种边想边写的精神真的很棒啊2333

分治这个思路确实很巧妙,比直接套等比公式然后硬找逆元要稳妥多了。毕竟9901是质数虽然可以用费马小定理,但像你说的那样直接除确实会出问题。

不过有个小建议哈,最后代码部分你让读者自己写是不是有点太"坑"了呀,好多人等着抄代码呢(bushi)

总的来说思路讲得很清楚,那个分治的推导过程也很详细,新手应该能看懂。给楼主动力!

坐等楼主更新下一题
頁: [1]
查看完整版本: poj1845 sumdiv 题解