﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-treeboy</title><link>http://www.cppblog.com/treeboy/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 04 Apr 2026 05:38:09 GMT</lastBuildDate><pubDate>Sat, 04 Apr 2026 05:38:09 GMT</pubDate><ttl>60</ttl><item><title>[转载]几道与Gcd有关的题</title><link>http://www.cppblog.com/treeboy/archive/2011/07/26/151893.html</link><dc:creator>treeboy</dc:creator><author>treeboy</author><pubDate>Tue, 26 Jul 2011 13:40:00 GMT</pubDate><guid>http://www.cppblog.com/treeboy/archive/2011/07/26/151893.html</guid><wfw:comment>http://www.cppblog.com/treeboy/comments/151893.html</wfw:comment><comments>http://www.cppblog.com/treeboy/archive/2011/07/26/151893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/treeboy/comments/commentRss/151893.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/treeboy/services/trackbacks/151893.html</trackback:ping><description><![CDATA[本文转载自<a href="http://hi.baidu.com/arorua_/home">ara神牛的blog<br /></a>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">真的是好东西~<br /><strong>(I). POJ 2480 Longge's problem (</strong><a href="http://poj.org/problem?id=2480"><strong>http://poj.org/problem?id=2480</strong></a><strong>)</strong></span></p>
<p class="MsoNormal"><span>题目大意</span><span style="mso-bidi-font-size: 10.5pt">: </span><span>求</span><span style="mso-bidi-font-size: 10.5pt"> sigma(gcd(i, n)), 1 &#8804; i &#8804; n.</span></p>
<p class="MsoNormal"><span>考虑到枚举</span><span style="mso-bidi-font-size: 10.5pt"> i </span><span>可能会超时</span><span style="mso-bidi-font-size: 10.5pt">, </span><span>我们可以反过来枚举</span><span style="mso-bidi-font-size: 10.5pt"> d | n, </span><span>那么答案就是</span><span style="mso-bidi-font-size: 10.5pt"> sigma(d * phi(n / d)).</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="mso-bidi-font-size: 10.5pt">(II). SPOJ LCMSUM (<a href="https://www.spoj.pl/problems/LCMSUM/">https://www.spoj.pl/problems/LCMSUM/</a>)</span></strong></p>
<p class="MsoNormal"><span>题目大意</span><span style="mso-bidi-font-size: 10.5pt">: </span><span>求</span><span style="mso-bidi-font-size: 10.5pt"> sigma(lcm(i, n)), 1 &#8804; i &#8804; n.</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">sigma(lcm(i, n)) = n * sigma(i / gcd(i, n)). </span><span>同上题一样</span><span style="mso-bidi-font-size: 10.5pt">, </span><span>枚举</span><span style="mso-bidi-font-size: 10.5pt"> d | n, </span><span>问题转化为求</span><span style="mso-bidi-font-size: 10.5pt"> sigma(i), gcd(i, n / d) == 1. </span><span>可以发现如果</span><span style="mso-bidi-font-size: 10.5pt"> i </span><span>与</span><span style="mso-bidi-font-size: 10.5pt"> n </span><span>互质</span><span style="mso-bidi-font-size: 10.5pt">, </span><span>那么</span><span style="mso-bidi-font-size: 10.5pt"> n &#8211; i</span><span>与</span><span style="mso-bidi-font-size: 10.5pt"> n </span><span>也互质</span><span style="mso-bidi-font-size: 10.5pt">. </span><span>将互质的数两两配对后答案就是</span><span style="mso-bidi-font-size: 10.5pt"> n / d * phi(n / d) / 2.</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="mso-bidi-font-size: 10.5pt">(III). SPOJ GCDEX (<a href="https://www.spoj.pl/problems/GCDEX/">https://www.spoj.pl/problems/GCDEX/</a>)</span></strong></p>
<p class="MsoNormal"><span>题目大意</span><span style="mso-bidi-font-size: 10.5pt">: </span><span>求</span><span style="mso-bidi-font-size: 10.5pt"> sigma(gcd(i, j)), 1 &#8804; i &lt; j &#8804; n. </span></p>
<p class="MsoNormal"><span>枚举</span><span style="mso-bidi-font-size: 10.5pt"> j </span><span>后转化为</span><span style="mso-bidi-font-size: 10.5pt"> (I).</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="mso-bidi-font-size: 10.5pt">(IV). POI Zap (<a href="http://www.zybbs.org/JudgeOnline/problem.php?id=1101">http://www.zybbs.org/JudgeOnline/problem.php?id=1101</a>)</span></strong></p>
<p class="MsoNormal"><span>题目大意</span><span style="mso-bidi-font-size: 10.5pt">: </span><span>求有多少对</span><span style="mso-bidi-font-size: 10.5pt"> gcd(i, j) == d (i &#8804; a, j &#8804; b).</span></p>
<p class="MsoNormal"><span>令</span><span style="mso-bidi-font-size: 10.5pt"> a&#8217; = a / d, b&#8217; = b / d, </span><span>问题等价于求满足</span><span style="mso-bidi-font-size: 10.5pt"> <span>gcd(i, j) == 1</span></span><span>的数量</span><span style="mso-bidi-font-size: 10.5pt"> (i &#8804; a&#8217;, j &#8804; b&#8217;).</span></p>
<p class="MsoNormal"><span>定义</span><span style="mso-bidi-font-size: 10.5pt"> F(k) </span><span>为</span><span style="mso-bidi-font-size: 10.5pt"> gcd(i, j) </span><span>&#8805;</span><span style="mso-bidi-font-size: 10.5pt"> k </span><span>的数量</span><span style="mso-bidi-font-size: 10.5pt">, G(k) </span><span>为</span><span style="mso-bidi-font-size: 10.5pt"> gcd(i, j) == k </span><span>的数量</span><span style="mso-bidi-font-size: 10.5pt">.</span></p>
<p class="MsoNormal"><span>那么</span><span style="mso-bidi-font-size: 10.5pt">F(k) = (a&#8217; / k) * (b&#8217; / k)</span></p>
<p class="MsoNormal"><span>根据容斥原理有</span><span style="mso-bidi-font-size: 10.5pt">G(1) = F(1) &#8211; F(2) &#8211; F(3) - F(5) + F(6) &#8230;</span></p>
<p class="MsoNormal"><span>系数可以用筛法预处理</span><span style="mso-bidi-font-size: 10.5pt">, </span><span>同时观察到对于连续的一段</span><span style="mso-bidi-font-size: 10.5pt"> k, F(k) </span><span>都是相同的</span><span style="mso-bidi-font-size: 10.5pt">,</span><span>可以一起算出来</span><span style="mso-bidi-font-size: 10.5pt">. </span><span>通过预处理系数的前缀和可以在</span><span style="mso-bidi-font-size: 10.5pt"> O(sqrt(n)) </span><span>的时间算出</span><span style="mso-bidi-font-size: 10.5pt"> G(1).</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="mso-bidi-font-size: 10.5pt">(V). SPOJ PGCD (<a href="https://www.spoj.pl/problems/PGCD/">https://www.spoj.pl/problems/PGCD/</a>)</span></strong></p>
<p class="MsoNormal"><span>题目大意</span><span style="mso-bidi-font-size: 10.5pt">: </span><span>求有多少</span><span style="mso-bidi-font-size: 10.5pt"> gcd(i, j) </span><span>是质数</span><span style="mso-bidi-font-size: 10.5pt">, 1 &#8804; i &#8804; a, 1 &#8804; j &#8804; b.</span></p>
<p class="MsoNormal"><span>枚举质数</span><span style="mso-bidi-font-size: 10.5pt"> P </span><span>后转化为</span><span style="mso-bidi-font-size: 10.5pt"> (IV).</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="mso-bidi-font-size: 10.5pt">(VI). NOI 2010 </span></strong><strong style="mso-bidi-font-weight: normal"><span>能量采集</span></strong><strong style="mso-bidi-font-weight: normal"><span style="mso-bidi-font-size: 10.5pt"> <span>(<a href="http://www.zybbs.org/JudgeOnline/problem.php?id=2005">http://www.zybbs.org/JudgeOnline/problem.php?id=2005</a>)</span></span></strong></p>
<p class="MsoNormal"><span>题目大意</span><span style="mso-bidi-font-size: 10.5pt">: </span><span>求</span><span style="mso-bidi-font-size: 10.5pt"> sigma(gcd(i, j)), i &#8804; a, j &#8804; b.</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">Sol 1.</span></p>
<p class="MsoNormal"><span>令</span><span style="mso-bidi-font-size: 10.5pt"> F[k] </span><span>为满足</span><span style="mso-bidi-font-size: 10.5pt"> gcd(i, j) == k </span><span>的数量</span><span style="mso-bidi-font-size: 10.5pt">.</span></p>
<p class="MsoNormal"><span>那么</span><span style="mso-bidi-font-size: 10.5pt">F[k] = (a / k) * (b / k) &#8211; F[2k] &#8211; F[3k] &#8211; F[4k] &#8230;</span></p>
<p class="MsoNormal"><span>答案就是</span><span style="mso-bidi-font-size: 10.5pt"> sigma(i * F[i]).</span></p>
<p class="MsoNormal"><span>时间复杂度</span><span style="mso-bidi-font-size: 10.5pt"> O(n / 1 + n / 2 + n / 3 + &#8230;) = O(nlogn).</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">&nbsp;</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">Sol 2.</span></p>
<p class="MsoNormal"><span>枚举</span><span style="mso-bidi-font-size: 10.5pt"> d = gcd(i, j), a&#8217; = a / d, b&#8217; = b / d, </span><span>那么问题转化为求满足</span><span style="mso-bidi-font-size: 10.5pt"> gcd(i, j) == 1(i &#8804; a, j &#8804; b) </span><span>的数量</span><span style="mso-bidi-font-size: 10.5pt">, </span><span>也就转化为</span><span style="mso-bidi-font-size: 10.5pt"> (IV), </span><span>将这个数量记为</span><span style="mso-bidi-font-size: 10.5pt"> F(a, b).</span></p>
<p class="MsoNormal"><span>同时注意到对于一段连续的</span><span style="mso-bidi-font-size: 10.5pt">d, F(a&#8217;, b&#8217;) </span><span>都是一样的</span><span style="mso-bidi-font-size: 10.5pt">, </span><span>可以一起算出来</span><span style="mso-bidi-font-size: 10.5pt">.</span></p>
<p class="MsoNormal"><span>时间复杂度</span><span style="mso-bidi-font-size: 10.5pt"> O(sqrt(n) * sqrt(n)) = O(n).</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="mso-bidi-font-size: 10.5pt">(VII). Crash </span></strong><strong style="mso-bidi-font-weight: normal"><span>的数字表格</span></strong><strong style="mso-bidi-font-weight: normal"><span style="mso-bidi-font-size: 10.5pt"> (<a href="http://www.zybbs.org/JudgeOnline/problem.php?id=2154">http://www.zybbs.org/JudgeOnline/problem.php?id=2154</a>)</span></strong></p>
<p class="MsoNormal"><span>题目大意</span><span style="mso-bidi-font-size: 10.5pt">: </span><span>求</span><span style="mso-bidi-font-size: 10.5pt"> sigma(lcm(i, j)) (i &#8804; a, j &#8804; b).</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">sigma(lcm(i, j)) = sigma(i * j / gcd(i, j))</span></p>
<p class="MsoNormal"><span>枚举</span><span style="mso-bidi-font-size: 10.5pt"> d = gcd(i, j), </span><span>我们只需要对于所有相同的</span><span style="mso-bidi-font-size: 10.5pt"> <span>d, </span></span><span>计算出</span><span style="mso-bidi-font-size: 10.5pt"> sigma(i * j).</span></p>
<p class="MsoNormal"><span>令</span><span style="mso-bidi-font-size: 10.5pt"> a&#8217; = a / d, b&#8217; = b / d, </span><span>那么问题转化为求</span><span style="mso-bidi-font-size: 10.5pt"> <span>F(a&#8217;, b&#8217;) = sigma(i * j) (gcd(i, j) == 1, i &#8804; a&#8217;, j &#8804; b&#8217;).</span></span></p>
<p class="MsoNormal"><span>令</span><span style="mso-bidi-font-size: 10.5pt"> Sum(a, b) </span><span style="mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 宋体">= 1 * 1 + 1 * 2 + </span><span>&#8230;</span><span style="mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 宋体"> + a * b, </span><span>由等差数列的求和公式可得</span><span>:</span></p>
<p class="MsoNormal"><span>Sum(a, b) = a * (a + 1) * b * (b + 1) / 4.</span></p>
<p class="MsoNormal"><span>根据容斥原理有</span><span style="mso-bidi-font-size: 10.5pt">F(a, b) =1<sup>2</sup> * Sum(a / 1, b / 1) - 2<sup>2</sup> * Sum(a / 2, b / 2) - 3<sup>2</sup> * Sum(a / 3, b / 3) - 5<sup>2</sup> * Sum(a / 5, b / 5) + 6<sup>2</sup> * Sum(a / 6, b / 6)..</span></p>
<p class="MsoNormal"><span>注意到对于一段连续的</span><span style="mso-bidi-font-size: 10.5pt"> i, Sum(a / i, b / i) </span><span>是相同的</span><span style="mso-bidi-font-size: 10.5pt">, Sum </span><span>的系数也可以通过筛法预处理出来</span><span style="mso-bidi-font-size: 10.5pt">.</span></p>
<p class="MsoNormal"><span>最后</span><span style="mso-bidi-font-size: 10.5pt">, </span><span>对于一段连续的</span><span style="mso-bidi-font-size: 10.5pt"> d, F(a&#8217;, b&#8217;) </span><span>也是相同的</span><span style="mso-bidi-font-size: 10.5pt">, </span><span>可以一起算出来</span><span style="mso-bidi-font-size: 10.5pt">.</span></p>
<p class="MsoNormal"><span>时间复杂度</span><span style="mso-bidi-font-size: 10.5pt"> O(sqrt(n) * sqrt(n)) = O(n).</span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 10.5pt">&nbsp;</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span>扩展阅读</span></strong></p>
<p class="MsoNormal"><span>线性筛法</span><span style="mso-bidi-font-size: 10.5pt">: <a href="http://www.cppblog.com/sdfond/archive/2009/03/16/76775.html">http://www.cppblog.com/sdfond/archive/2009/03/16/76775.html</a></span></p>
<p class="MsoNormal"><span>四道</span><span style="mso-bidi-font-size: 10.5pt">Gcd</span><span>统计问题</span><span style="mso-bidi-font-size: 10.5pt">: <a href="http://hi.baidu.com/广陵lonely散/blog/item/6b00f8de2ca366b7cd11669e.html">http://hi.baidu.com/<span>广陵</span>lonely<span>散</span>/blog/item/6b00f8de2ca366b7cd11669e.html</a></span></p><br /><br /><img src ="http://www.cppblog.com/treeboy/aggbug/151893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/treeboy/" target="_blank">treeboy</a> 2011-07-26 21:40 <a href="http://www.cppblog.com/treeboy/archive/2011/07/26/151893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>八中OJ</title><link>http://www.cppblog.com/treeboy/archive/2011/06/21/149088.html</link><dc:creator>treeboy</dc:creator><author>treeboy</author><pubDate>Tue, 21 Jun 2011 02:49:00 GMT</pubDate><guid>http://www.cppblog.com/treeboy/archive/2011/06/21/149088.html</guid><wfw:comment>http://www.cppblog.com/treeboy/comments/149088.html</wfw:comment><comments>http://www.cppblog.com/treeboy/archive/2011/06/21/149088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/treeboy/comments/commentRss/149088.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/treeboy/services/trackbacks/149088.html</trackback:ping><description><![CDATA[<div>[Sdoi2011]工作安排: 规模不大,工作安排.很容易想到费用流,由于愤怒函数单调增,所以直接连边.费用作差<br />[Sdoi2011]消耗战: 很综合的一道题.可以看出来是树中的最小割.两种做法:1)增加一个汇点,将每个询问定点连汇,容量INF.实现好的link_cut tree维护最大流能跑过去.2)直接思维的话去掉的边肯定是一些点的LCA到根的最小值.那么就把所有的点分组.用动态规划去做(单调栈维护)</div>
<div>2011.7.14多做题,多思考&gt;_&lt;</div>
<div>[2010国家集训队]拉拉队排练:找前k长的奇数长的回文串的乘积.这是一个很经典的后缀数组维护的题目,但是学习了twb神牛的神扩展kmp解法.(回来用后缀数组写一个^_^)</div>
<div>[2010国家集训队]布娃娃:给定一坨区间,找符合该区间的第k大值.添加事件点,用一棵平衡树维护每个布娃娃的魅力值.<br />2010.7.25从数学夏令营回来,晋级问题不大<br />[2010国家集训队]稳定婚姻:先写了一个暴力网络流,然后总结增广路的形式,膜拜我校的小同学</div><img src ="http://www.cppblog.com/treeboy/aggbug/149088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/treeboy/" target="_blank">treeboy</a> 2011-06-21 10:49 <a href="http://www.cppblog.com/treeboy/archive/2011/06/21/149088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tyvj做题记录</title><link>http://www.cppblog.com/treeboy/archive/2011/06/07/148232.html</link><dc:creator>treeboy</dc:creator><author>treeboy</author><pubDate>Tue, 07 Jun 2011 13:56:00 GMT</pubDate><guid>http://www.cppblog.com/treeboy/archive/2011/06/07/148232.html</guid><wfw:comment>http://www.cppblog.com/treeboy/comments/148232.html</wfw:comment><comments>http://www.cppblog.com/treeboy/archive/2011/06/07/148232.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/treeboy/comments/commentRss/148232.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/treeboy/services/trackbacks/148232.html</trackback:ping><description><![CDATA[<div align="justify"><a href="http://www.tyvj.cn:8080/Problem_Show.asp?id=1518">[CPU监控]</a>&nbsp;线段树的好题.先考虑PQA和CQA的做法."标记域是用来总结一段操作序列","逢下传必更新".<br /><a href="http://www.tyvj.cn:8080/Problem_Show.asp?id=1478">[<u><font color="#0066cc">序列划分</font></u>]</a>&nbsp;直接O(N)贪心.很容易想到<br />[菌落计算] 扫描线+线段树维护.利用前缀和的思想计算答案.要离散化<br />[计算机检修] heap<br />[航线导航] POJ的原题(鸣谢:Foreverbell).设F[s][c]在s点有c的最小花费.维护这个东西就可以了</div><img src ="http://www.cppblog.com/treeboy/aggbug/148232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/treeboy/" target="_blank">treeboy</a> 2011-06-07 21:56 <a href="http://www.cppblog.com/treeboy/archive/2011/06/07/148232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPOJ做题记录</title><link>http://www.cppblog.com/treeboy/archive/2011/05/29/147618.html</link><dc:creator>treeboy</dc:creator><author>treeboy</author><pubDate>Sun, 29 May 2011 06:08:00 GMT</pubDate><guid>http://www.cppblog.com/treeboy/archive/2011/05/29/147618.html</guid><wfw:comment>http://www.cppblog.com/treeboy/comments/147618.html</wfw:comment><comments>http://www.cppblog.com/treeboy/archive/2011/05/29/147618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/treeboy/comments/commentRss/147618.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/treeboy/services/trackbacks/147618.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt"><a href="http://www.spoj.pl/problems/GSS1/">GSS1</a>:给定一个序列,要求求出一个区间[l,r]中最大的子段和.维护一棵线段树,记录每个子区间的总和,从左边连续的最大和,右边连续的最大和,区间的最大子段和.查询的时候要注意转移细节.</span> </p>
<p><span style="font-size: 10pt"><a href="https://www.spoj.pl/problems/COURIER/"><span style="font-size: 10pt">COURIER</span></a>:状态压缩的动态规划.f[S][Bx]表示人已经完成了S集合中的任务,当前在任务x的结束位置Bx时的mindist.<br />f[S|(1&lt;&lt;y)][By]=min{f[S][Bx]+dist(Bx,Ay)+dist(Ay+By)} 最后扫描答案时注意还要回到源点</span><span style="font-size: 10pt"><br /></span></p><img src ="http://www.cppblog.com/treeboy/aggbug/147618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/treeboy/" target="_blank">treeboy</a> 2011-05-29 14:08 <a href="http://www.cppblog.com/treeboy/archive/2011/05/29/147618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>