<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>算法 on 分而治之</title>
        <link>https://www.pythoner.work/categories/%E7%AE%97%E6%B3%95/</link>
        <description>Recent content in 算法 on 分而治之</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>Divide and Conquer. All rights reserved.</copyright>
        <lastBuildDate>Thu, 11 Aug 2022 11:56:00 +0800</lastBuildDate><atom:link href="https://www.pythoner.work/categories/%E7%AE%97%E6%B3%95/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>快速幂</title>
        <link>https://www.pythoner.work/post/quick-power/</link>
        <pubDate>Thu, 11 Aug 2022 11:56:00 +0800</pubDate>
        
        <guid>https://www.pythoner.work/post/quick-power/</guid>
        <description>&lt;h2 id=&#34;目的&#34;&gt;目的
&lt;/h2&gt;&lt;p&gt;求$m ^ k$ $\bmod$ $p$&lt;/p&gt;
&lt;h2 id=&#34;反复平方法&#34;&gt;反复平方法
&lt;/h2&gt;&lt;h3 id=&#34;预处理&#34;&gt;预处理
&lt;/h3&gt;&lt;p&gt;$O(k)$预处理出来以下的数：&lt;br&gt;
$m ^ {2 ^ 0}$ $\bmod$ $p$&lt;br&gt;
$m ^ {2 ^ 1}$ $\bmod$ $p$&lt;br&gt;
$m ^ {2 ^ 2}$ $\bmod$ $p$&lt;br&gt;
&amp;hellip;&lt;br&gt;
$m ^ {2 ^{\log{k}}}$ $\bmod$ $p$&lt;/p&gt;
&lt;p&gt;怎么做？直接循环！代码忽略，因为还要优化。&lt;/p&gt;
&lt;h3 id=&#34;算答案&#34;&gt;算答案
&lt;/h3&gt;&lt;p&gt;举例子，$4 ^{5}$ $\bmod$ $10$
$ = (4^{2 ^ 2}$ $\bmod$ $10$ $\times$ $4 ^{2 ^ 0}$ $\bmod$ $10)$ $\bmod$ $10$&lt;/p&gt;
&lt;p&gt;就可以调预处理的数了，&lt;br&gt;
$4^{2 ^ 2}$ $\bmod$ $10$ $ = $ $6$&lt;br&gt;
$4^{2 ^ 0}$ $\bmod$ $10$ $ = $ $4$&lt;br&gt;
$(6$ $\times$ $4)$ $\bmod$ $10$ $ = $ $4$&lt;/p&gt;
&lt;p&gt;验证一下：&lt;br&gt;
$4^5$ $\bmod$ $10$ $=$ $1024$ $\bmod$ $10$ $=$ $4$&lt;/p&gt;
&lt;p&gt;把$k$转化为二进制并取出对应的数再相乘，$O(k)$。&lt;/p&gt;
&lt;h3 id=&#34;把两个步骤合在一起&#34;&gt;把两个步骤合在一起
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;qmi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;k&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;关键操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;k &amp;amp; 1&lt;/code&gt; $k$ 的末位（二进制）为$0$&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LL&lt;/code&gt; 乘的过程可能会爆&lt;code&gt;int&lt;/code&gt;，使用&lt;code&gt;long long&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至此，模板题就可以$\Large{\color{green}{AC}}$辣！&lt;/p&gt;
&lt;h2 id=&#34;应用题&#34;&gt;应用题
&lt;/h2&gt;&lt;h3 id=&#34;幂次方&#34;&gt;幂次方
&lt;/h3&gt;&lt;h4 id=&#34;题面&#34;&gt;题面
&lt;/h4&gt;&lt;p&gt;对任意正整数 $N$，计算 $X^N \bmod 233333$ 的值。&lt;/p&gt;
&lt;p&gt;（输入输出不用管他）&lt;/p&gt;
&lt;h4 id=&#34;解法&#34;&gt;解法
&lt;/h4&gt;&lt;p&gt;把$233333$看作$p$，彻头彻尾的一道快速幂题。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;qmi(X, N, 233333)&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;越狱&#34;&gt;越狱
&lt;/h3&gt;&lt;h4 id=&#34;题面-1&#34;&gt;题面
&lt;/h4&gt;&lt;p&gt;监狱有连续编号为 $1$ 到 $n$ 的 $n$ 个房间，每个房间关押一个犯人。&lt;/p&gt;
&lt;p&gt;有 $m$ 种宗教，每个犯人可能信仰其中一种。&lt;/p&gt;
&lt;p&gt;如果相邻房间的犯人信仰的宗教相同，就可能发生越狱。&lt;/p&gt;
&lt;p&gt;求有多少种状态可能发生越狱，对 $100003$ 取余。&lt;/p&gt;
&lt;h4 id=&#34;解法-1&#34;&gt;解法
&lt;/h4&gt;&lt;p&gt;直接想发生越狱的情况数不好想，那就想不发生越狱，$1$有$n$钟选择，$2$要想不发生越狱需要避开$1$的选择，有$n - 1$钟，后面的每一个人都需要避开前面一人的选择，都是$n - 1$种选择。列算式：
$$m (m - 1)^{n-1}$$
那不越狱的方案数就是：
$$m^n - m(m - 1)^{n - 1}$$
用快速幂解决问题。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
