<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>无存在感小透明</title>
    <link>https://ry.huaji.store/</link>
    
    <image>
      <url>https://ry.huaji.store/images/favicon.png</url>
      <title>无存在感小透明</title>
      <link>https://ry.huaji.store/</link>
    </image>
    
    <atom:link href="https://ry.huaji.store/rss2.xml" rel="self" type="application/rss+xml"/>
    
    <description>(✿╹◡╹) 相信的心就是你的魔法 (╹◡╹✿)</description>
    <pubDate>Thu, 09 Apr 2026 11:09:58 GMT</pubDate>
    <generator>http://hexo.io/</generator>
    
    <item>
      <title>启用 Chrome 浏览器中被停用的不再受支持的 Manifest V2 Extensions</title>
      <link>https://ry.huaji.store/2026/01/Chrome-manifest-v2/</link>
      <guid>https://ry.huaji.store/2026/01/Chrome-manifest-v2/</guid>
      <pubDate>Wed, 07 Jan 2026 14:00:00 GMT</pubDate>
      
      <description>继续使用旧版本的浏览器扩展程序！适用于 Chrome 147.0.7727.56 及过往版本</description>
      
      
      
      <content:encoded><![CDATA[<p>Google 在七八年前就搞出来了 <a href="https://developer.chrome.com/docs/extensions/develop/migrate/what-is-mv3?hl=zh-cn" target="_blank" rel="noopener">Manifest V3</a> 这个浏览器扩展程序的新标准，旨在加强扩展程序的隐私保护、安全性和性能。不过由于大家的一致反对，整个迁移过程一直拖到去年才尘埃落地。谷歌已于 <a href="https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline?hl=zh-cn" target="_blank" rel="noopener">2025 年 7 月 24 日在所有位置停用 Manifest V2</a>。</p><p>诚然，新的标准确实带来了不少好处，而且现在看 Google 也并不是因为顾及其钱袋子而搞骚操作。但客观而言我的 Chrome 浏览器中仍有不少实用但已停止维护的扩展，找来找去也没有最佳替代方案，还是看看怎么让 Chrome 继续使用 Manifest V2 的扩展程序吧。</p><p>总体来说最简单的方案其实是改用 Microsoft Edge 浏览器，迁移过程也十分方便，毕竟它现在也是基于 Chromium 开发的（有点怀念当年的使用 EdgeHTML + Chakra 的旧版 Microsoft Edge 了）。不过这几年微软可是越来越魔幻以至于魔怔了，我还是继续 Chrome 吧，实在是有点害怕QAQ</p><p>好在如今我们还是有方法解决这个问题的（适用于 Chrome 147.0.7727.56 及过往版本），目前看来这个方法会一直有效，应该是 Google 是故意留下来的。操作其实也很简单，就是<strong>给 Chrome 加启动参数</strong>。之前折腾过好多办法，现在看来还得是这个，核心就是在 Chrome 启动时传入参数开启 Manifest V2 支持：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">--<span class="built_in">disable</span>-features=ExtensionManifestV2Unsupported,ExtensionManifestV2Disabled</span><br></pre></td></tr></table></figure><hr><h3 id="Windows-用户"><a href="#Windows-用户" class="headerlink" title="Windows 用户"></a>Windows 用户</h3><p>Windows 用户请<code>鼠标右键 -&gt; 新建 -&gt; 快捷方式</code>并填入：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">"C:\Program Files\Google\Chrome\Application\chrome.exe"</span> -<span class="literal">-disable</span><span class="literal">-features</span>=ExtensionManifestV2Unsupported,ExtensionManifestV2Disabled</span><br></pre></td></tr></table></figure><p>如果 <code>Chrome.exe</code> 不在 <code>&quot;C:\Program Files\Google\Chrome\Application\chrome.exe&quot;</code>，请修改为实际的安装地址，记得<strong>保留现有的双引号</strong>。</p><p>对于已有的 Chrome 快捷方式，直接修改<code>鼠标右键 -&gt; 属性 -&gt; 目标</code>即可。</p><hr><h3 id="MacOS-用户"><a href="#MacOS-用户" class="headerlink" title="MacOS 用户"></a>MacOS 用户</h3><p>MacOS 用户请先<strong>完全退出</strong> Chrome 后，在<code>启动台</code>中找到<code>终端</code>，打开并输入执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">open -b com.google.Chrome --new --args --<span class="built_in">disable</span>-features=ExtensionManifestV2Unsupported,ExtensionManifestV2Disabled</span><br></pre></td></tr></table></figure><p>这会打开一个全新的 Chrome 进程，之后就可以退出<code>终端</code>了。</p><p>当然也可以使用<code>启动台</code>中的<code>自动操作</code>或者<code>脚本编辑器</code>去创建快捷方式，不过 MacOS 中 Chrome 一般是常驻后台的，而且也不经常关机或重启，这里就不对此方法过多展开了。</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Chrome/">Chrome</category>
      
      <category domain="https://ry.huaji.store/tags/Browser-Extensions/">Browser Extensions</category>
      
      
      <comments>https://ry.huaji.store/2026/01/Chrome-manifest-v2/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>NEW · It is me!</title>
      <link>https://ry.huaji.store/2025/12/Original-character/</link>
      <guid>https://ry.huaji.store/2025/12/Original-character/</guid>
      <pubDate>Mon, 08 Dec 2025 04:00:00 GMT</pubDate>
      
      <description>我的全新立绘！既是 OC (Original Character) 也是自设！</description>
      
      
      
      <content:encoded><![CDATA[<p>我是垚！</p><p>这是我的全新立绘！既是 OC (Original Character) 也是自设！</p><p>感谢 Ayako 的倾情创作！画师本人也有出镜哟！</p><p><img src="/images/Original-character/20251208120000.png" alt=""></p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E7%BB%98%E7%94%BB/">绘画</category>
      
      <category domain="https://ry.huaji.store/tags/%E8%87%AA%E8%AE%BE/">自设</category>
      
      
      <comments>https://ry.huaji.store/2025/12/Original-character/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>梅丽库里斯玛斯！</title>
      <link>https://ry.huaji.store/2024/12/Merry-Christmas/</link>
      <guid>https://ry.huaji.store/2024/12/Merry-Christmas/</guid>
      <pubDate>Thu, 12 Dec 2024 04:59:19 GMT</pubDate>
      
      <description>哦！我亲爱的朋友！圣诞快乐！</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>我这人一向是不过圣诞节的，上一次的记忆还停留在小时候家里的圣诞树和圣诞袜。但这两年的一些情况让我开始庆祝这个文化底蕴与我毫无关联的节日。至于具体的原因嘛，每到这个时间点周围人或多或少都能听到我在你们耳旁吹风（逃）。不过归根到底，其实还是那句话</p><blockquote><p>“不管黑猫白猫，能捉到老鼠就是好猫。”</p></blockquote><p>讲到这里有些人就有说法了，什么“过洋节”、“崇洋媚外”、“文化侵略”云云，然后把我批判一番，说我</p><blockquote><p>“Too young too simple, sometimes naive!”</p></blockquote><p>倒不是我不喜欢传统节日，但看看当下情况，不是调休就是各种禁止，脸都不要了（不过明年开始法定节假日变多值得好评，换回点颜面）。就拿春节举例，大过年的，年味儿这么淡，人家年兽也有理由说的：“你们过的什么节啊，连鞭炮都不放，能不能给我点基本的尊重？”再这么下去年轻人都不知道什么是“年”了，更别说什么弘扬传统习俗了。</p><p>至于为什么现在年轻人喜欢西方节日，原因很简单，就是找个由头出来玩。你看传统节日就没几个是让大家出门和同龄人一起开开心心娱乐的。大多数人过圣诞只是一个借口，毕竟大家可能连“圣诞”二字的含义都不知道。这重要么？这不重要，开心才重要！中国人缺的不是节，是假，是没有心里负担地去放松放松的理由。</p><blockquote><p>“人民喜闻乐见，你不喜欢，你算老几？”</p></blockquote><p>没有意义可能就是圣诞节对我最大的意义。这也不过只是个借口罢了。</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>说到圣诞节，我会联想到什么？</p><blockquote><p><em>Merry Christmas Mr. Lawrence</em></p></blockquote><blockquote><p>圣诞树、圣诞老人与圣诞袜</p></blockquote><blockquote><p>又到了白色相簿的季节：“<del>是我，是我先，明明都是我先来的…</del>”</p></blockquote><blockquote><p>正在解冻的各种圣诞神曲与微信头像上的圣诞帽</p></blockquote><blockquote><p>《看不见的女朋友》</p></blockquote><p>你呢？你又会想起什么？</p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>《看不见的女朋友》已经是我十多年前看的网文，但它其实是最符合我心目中的圣诞节。与其说是网文，用短篇小说来称呼它更为恰当。当时似乎还是在 A 岛偶然发现的，读罢大为震撼。</p><blockquote><p>“浴室里没有人，水是我开的。”</p></blockquote><p>这句话一举奠定了我对圣诞节的刻板印象与基调，影响至今。斯人已逝 A 岛已沉，如今我会将此文附在文末，希望你会喜欢（笑</p><hr><h3 id="四"><a href="#四" class="headerlink" title="四"></a>四</h3><p>今天在写这篇博文的时候其实还发生了件事，就在当下，还蛮奇妙的。</p><p>有个同事经常会找我问一些部署问题。这位印度大姐也是生猛，动不动就一个电话直接打过来，搞得我每次见她 Say Hi 开启对话时都有点害怕。</p><p>不过今天情况不同于以往，她说只是随便聊聊。</p><p>紧接着她用口语化的英语不断发着消息。她表示唯一的中国朋友已经离开了这家公司，而她也不用社交媒体，因而来找我聊只是想分享分享她最近看的一部如此美丽且感人的电影：</p><blockquote><p>《人生大事》 <em>Lighting Up The Stars</em></p></blockquote><p>片尾曲没有英文字幕她听不懂，但是乐曲仍然是那么美妙。她表示会和自己的孩子们再看一遍，也希望我有时间能去看看。</p><p>对于那些有着老套且公式化 OTP (主角配对 One True Pairing) 的电影，她往往很难一口气看完，但这一次却有着完全不同的体验。</p><p>全员演技精湛，电影展现了一些与她们相似的文化与传统，父女之间的感情也格外令人动容，她告诉我说她几乎是全程哭着看完的。</p><p>她很高兴能和我聊聊这些事，也希望我不要介意。</p><p>当然不会！很感谢你的分享！</p><p>说实话这事还让我蛮触动的。毕业工作这么些年，第一次在工作场合的社交与人际关系中有如此的人与人之间的链接，心中不免有些波澜。以至于一时不知怎么回复那一长串的消息，这不仅是不同语言之间的隔阂，也是情感的难以表达。</p><p>对于素未谋面的同事，邮件也好，消息也罢，常常都是客气而礼貌的谈论工作与业务上的交集。而一场关于电影的，横跨不同国家与文化底蕴的对话，能在此时此地发生，还蛮神奇且微妙的。</p><p>这事还挺令人高兴，一扫最近工作与生活中的阴霾。我相信这是部很棒的电影，也表示会找时间看看，届时还能将片尾曲的英文歌词分享给她。</p><p>Thanks!🥳</p><hr><h3 id="五"><a href="#五" class="headerlink" title="五"></a>五</h3><p>回到正题，满打满算其实我也就过了两个圣诞节：去年和前年<del>（一个是圣诞节，另一个也是圣诞节）</del>。</p><p>前年 2022 年的圣诞节正好赶上周末，我回家看望爸妈了，以至于在我妈耳边吹风的我还被吐槽了。</p><p>去年 2023 年的圣诞节就比较离奇了，一天查出四个疾病，直接给我带走了，连急诊科的医生都说我怎么又来了。</p><p>最后不仅是圣诞，连元旦都是在医院度过的，真是难忘啊（棒读）。</p><p>按照每过一年相同日期对应星期数加一的算法，今年的平安夜和圣诞节就是两边不靠了。</p><p>（我一度觉得这个算法蛮神奇的，直到遇见了润年。其实原理也蛮简单，就是 365 对 7 取模余 1 而已XD）</p><p>今年大概率是不会像去年一样得病了，因为现在已经病了（悲）。不仅有和去年相同的病症，还有更严重的新问题（带 DLC 的最新加强版了属于是）。</p><blockquote><p>：“最近怎么样了？好些了么？”<br>：“昨天你问的话我会说好些了，但今天又开始疼了。”</p></blockquote><p>其实应该说是症状反反复复还没康复，每次恢复差不多了又不出意外地出意外被干趴下，这已经是第二回了。</p><p>所以今年 2024 年的圣诞节大概率在家休养生息，看看上面提到的那部电影，也可能会去见见朋友什么的。</p><p>嘛，希望人没事。</p><p>其实去年的我还挺期待圣诞节的，那会儿还发了个社交媒体说希望下周就是圣诞。</p><p>哎，世事难料啊。</p><p>总而言之，我的朋友，圣诞快乐！或许今年的圣诞节会有些不一样，谁知道呢？</p><p>“浴室里没有人，水是我开的。”</p><hr><h3 id="《看不见的女朋友》"><a href="#《看不见的女朋友》" class="headerlink" title="《看不见的女朋友》"></a>《看不见的女朋友》</h3><p>有一年圣诞节，室友和女朋友约会去了，我一个人在房间里。</p><p>我把浴室的灯打开，把热水打开，浴室里就雾气腾腾透出光亮，像一个神迹显现。</p><p>我在隔着一个客厅的房间里上网，发帖子，发微博，假装自己正在等一个女人洗完澡，出来陪我做爱，但其实水是我开的，浴室里没人。</p><p>我的室友回来了，带着一个女孩，他很吃惊的看着浴室。</p><p>你带了人回来吗？</p><p>我应该诚实，但真相太可悲了，我说是的，我带了人回来。</p><p>他拍拍我，说好小子，真看不出来呀，那就不打扰你了。神色隐秘的一笑，和他的女友钻进他的房间了。</p><p>但其实浴室里没有人，水是我开的，过了一会，我觉得这样很浪费，就把水关了。回到自己的房间睡着了。</p><p>后来我的室友就跟人说，我有一个女友。别人就问我，你有一个女友吗？</p><p>我怎么说呢？我只能说是，我不能告诉他们水是我开的，卧室里没有人。</p><p>所以我度过了一段麻烦的日子。我不能再参与单身汉的下班活动了，因为他们听说，我有个女友。</p><p>去陪你的小情人吧，他们一群人哄着赶走了我。</p><p>公司里发电影票，他们给了我两张，我装作很感谢的样子，可是我从哪儿找另一个人陪我去看电影呢？</p><p>所以我一个人，旁边的位置上放着我的爆米花。</p><p>你和你的女朋友吵架吗？他们问我。我该怎么回答呢？我说，不经常吵。这是真的，我们没吵过架。</p><p>有些时候他们老见不到我的女朋友，就很奇怪，为什么见不到你的女朋友呢？而且有些心直口快的女孩说，你都从不给你的女朋友买东西，还说，不吵架，就是快散了。</p><p>所以我被她们拉着买了一些女人的小玩意，有些东西真的不错，我想，在我送给她的时候，她会很高兴吧。</p><p>后来他们还是没有见过我的女朋友，一直都没有，我怎么办？告诉他们浴室里没有人，水是我开的？</p><p>我说不出口，没有办法，我买了一些卫生巾，不常见的型号，还有唇膏，一些粉底。</p><p>有人走进我的房间，说这些东西是谁的？</p><p>是我女朋友的，因为她有时候在我这里过夜，所以我为她准备了一些常用品，比如卫生巾，都是她特别用的那种。</p><p>女人听完泪眼婆娑，揪她男友的袖子，你看看人家。连男人都露出了不好意思的神色。</p><p>谁会不信我呢？谁会不信我有个女友呢？</p><p>只是她性格怪癖，不爱见人而已。</p><p>我隔三差五给卫生巾滴上可乐，扔进厕所的垃圾桶里，我上班前在粉底上揩一下，抹在脸上。</p><p>要是有一部相机留下每天我卧室内的照片，那些东西都在一天天减少，看起来就好像有个隐形女友一样。</p><p>人人都相信我有个女朋友。没人会发觉浴室里其实没有人，水是我开的。</p><p>又过了很长时间。</p><p>我们的老板找我去办公室，面带关切，莫名其妙给了我一天假，隔壁桌的两个女孩面带同情的看着我，鼓励我，像我这么好的男人，肯定能找到更好的。</p><p>我才知道有人看到我一个人去看电影了，还看到我一个人买了两个人的位子，在电影中间哭。</p><p>哦，原来我是失恋了。虽然那部片子很感人啊。</p><p>我简直想痛骂自己一顿，这是早就可以通往解脱的一条路，我早就应该这么说啊。仅仅是因为卫生巾和粉底不算贵，我不知不觉这么过了好长时间。</p><p>我立即揪着自己的头发，很痛苦的样子，喃喃着远方。她们又捂着嘴，抽鼻子，背过头，有一个人忍不住还哭了。</p><p>我没哭，我跟我女友没什么感情。</p><p>我又单身了，吃过两顿安慰饭之后，一切又回归了生活的平静。有女孩要给我介绍女朋友。</p><p>他为她女友买专用的卫生巾呢！她们不厌其烦的说，讲了很多我都不知道的痴情故事，是吗？那个介绍来的女孩偏过头来问我。</p><p>我怎么办，我只能说，是啊。难道要我告诉她，浴室里没有人，水是我开的？</p><p>我跟那个女孩出去了两次，后来她委婉的把这事分了。</p><p>你的心里空落落的，我感觉你还爱着她，我没信心取代这个位置。她眼红红的，临走还给我一拥抱。</p><p>这姑娘真够意思。后来就没人再介绍女孩给我了。</p><p>经她这么一点拨，我开始想念起我的前女友来，然后我想起来，我没有一个前女友啊。</p><p>浴室里没有人，水是我开的。</p><p>又到了一年圣诞节，还是那个室友，和一个不同的姑娘出去了，我一个人在屋里上网。</p><p>我那时候想，不知道那一次圣诞节，我究竟是因为什么把浴室里的热水打开呢？</p><p>一个人点着一根烟，在昏暗的灯光里，感觉很冷。想了很久，突然想起来，原来我是在想象有一个女孩是属于我的。</p><p>没有抗拒这诱惑力，我打开灯，扭开热水，浴室里就雾气腾腾透出光亮，像一个神迹显现。</p><p>这时候，我的室友抱着那个女孩回来了，他看着浴室，先是好奇，接着露出了惊讶和欣喜的神色。</p><p>是她回来了？</p><p>他旁边的女孩都跟着高兴和惊讶起来，是你跟我说的那个吗？是他以前那个女朋友吗？</p><p>两个人调子都变了，在客厅里高兴的又蹦又跳，好像约瑟和马利亚。</p><p>不，我说。</p><p>浴室里没有人，水是我开的。</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      
      
      <comments>https://ry.huaji.store/2024/12/Merry-Christmas/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>ChiliChill 2024「混入人类计划」全国巡演</title>
      <link>https://ry.huaji.store/2024/11/ChiliChill-2024/</link>
      <guid>https://ry.huaji.store/2024/11/ChiliChill-2024/</guid>
      <pubDate>Tue, 12 Nov 2024 12:29:36 GMT</pubDate>
      
      <description>一场痛并快乐着的 Live 演出，也借这个契机聊聊近况</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>一年一度的 Live<br>这次换了个大场地<br>人数据说比去年翻了好几倍<br>作为最后十分钟卡点入场的我<br>拿到了 1014 号码牌<br>还好新专辑的场贩没有切<br>这次照例是新 CD 喜加一<br>ChiliChill 你是真的火了</p><p><img src="/images/ChiliChill-2024/20241109185458.jpg" alt=""></p><p>之所以说​痛并快乐着<br>因为前两天阑尾炎了<br>正好是立冬的那天<br>每年冬日定番<br>就连大概原因和疼的位置都与上次一模一样<br>所以这次我也没抢签售票了<br>Live 结束一亮灯直接往外冲<br>打车去医院输液<br>结果护士站还给我输液单搞丢了<br>福无双至<br>祸不单行</p><p>看 Live 这事必然是值得发一条社交媒体的<br>然后就有朋友问我了<br>“怎么你一发微博下面就有 AI 评论x”<br>笑<br>可能是没人理我怕我尴尬吧hhhhh<br>时 刻 警 惕 人 工 智 能</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>这次的 Live 无疑是超赞的<br>而且没有遇到身高不够被前排挡住的问题<br>中场照例是于老师的脱口秀环节<br>今年不仅有的成都笑话<br>还有大家耳熟能详的贝斯笑话<br>据说有志愿者因为这次演出结缘的<br>真的是红娘体质<br>还有专程从墨尔本回来看演出的小伙伴<br>厉害了</p><p>很可惜的是今年没有听到《神仙说他也不懂》<br>不过这次也有好活<br>搞了个厚嘴唇星 KTV 环节<br>让观众们自己大合唱<br>看来于老师这是要步入伍佰老师后尘啊（不是</p><p><img src="/images/ChiliChill-2024/20241109202545.jpg" alt=""></p><p>曲目方面<br>作为成名曲之一的《我的悲伤是水做的》是必不可少的</p><blockquote><p>“我的太阳，在哪里呢？”</p></blockquote><p>你们什么时候才能出新的中文 Vocaloid 曲啊QAQ</p><p><img src="/images/ChiliChill-2024/20241109192641.jpg" alt=""></p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>不过因为疾病缠身<br>犯了老问题<br>就是在这种沉浸式场景中不够沉浸<br>总想脱离出来<br>然后脑中就会开始胡思乱想<br>这个问题在有外界干扰因素的时候就会十分严重<br>最近去看的电影《蓦然回首》的点映场就是这样<br>人数众多外加灯光晃眼<br>观影体验就不是很好<br>故事蛮喜欢的但是就是沉浸不下来<br>希望后续重看原作和电影能弥补缺憾吧</p><p>说到电影<br>近期还有一部上大银幕的是《通往夏天的隧道，再见的出口》<br>当时的影厅虽小但是观感一流<br>虽然蛮多人的评论是偏负面的<br>但我个人觉得是适合周末时光的电影<br>是社畜就好的这一口工业糖精<br>“这就是爱情！”</p><p>今年最印象深刻的 Live 当属魔法未来 2024 东京场了<br>总共去了两场<br>第一场的时候老问题依旧<br>总是在关心一些细枝末节的问题<br>不过到了千秋乐就彻底嗨起来了<br>当时没觉得这演出有多么出彩<br>现在回想起来可谓是王炸<br>千秋乐的时候我前后左右分别坐着<br>台湾人、日本人、韩国人和欧美人<br>演出结束的时候不知道谁起了个主题曲的调调<br>然后大家就不约而同的一起哼唱起来了<br>这个旋律至今还印刻在我脑子里<br>每次想起时也是蛮幸福的<br>离场的时候还有自发组成的欢送队伍<br>真好</p><hr><h3 id="四"><a href="#四" class="headerlink" title="四"></a>四</h3><p>离上一篇博客成稿已经过去了三个月了<br>这期间也发生了蛮多事的<br>最直观的事就是我还欠了两篇博客没写（逃）<br>已经记录在 TODO List 里面了<br>会写的！（吧？</p><p>七八月份从杭州北京回来之后<br>又陆续去了上海和东京<br>国庆节的时候还有大学室友来成都玩<br>见了许多人<br>聊了不少天<br>不过你问我这段时间在做什么事<br>我也不知道<br>可能是瞎忙吧<br>感觉我人生大部分时间都处于这个状态<br>完成的每一件事在微观的维度都是又意义和价值的<br>但在宏观的时间视角我也不知道我在忙什么<br>努力生活？<br>或许吧</p><blockquote><p>“J’aime la vie”</p></blockquote><p>希望你也是</p><p><img src="/images/ChiliChill-2024/20241109191303.jpg" alt=""></p><hr><h3 id="五"><a href="#五" class="headerlink" title="五"></a>五</h3><p>说到胡思乱想<br>这份思考现在已经不怎么包含爱情了<br>已经过去了三个月了<br>谈不上毫无波澜<br>只能说是偶尔还有点念想<br>有点唏嘘<br>肯定是回不到过去了<br>想也么用！<br>不许想！<br>剩下的交给时间吧<br>就像矢先稻荷神社的那张末吉的爱情签<br>“虽然可能做不到 但是还是请重振旗鼓追求新的人吧”<br>至于后面的嘛<br>命中注定有那我乐意接受<br>没有也不必强求<br>一个人也要认真生活<br>一个人的日子也挺好</p><p>我这个人还挺爱做白日梦的<br>幻想天降横财<br>幻想时空穿越<br>幻想彗星撞地球<br>幻想穿越世界的旅行<br>今年我其实意识到了<br>许多事其实没有那么可望不可及<br>毕竟现在还年轻<br>肩上也没有什么重担<br>人生还是需要一些冲动<br>去做点不考虑后果的事<br>那<br>过了今年出远门走走吧<br>Live 现场被这首歌戳到了<br>有了这些想法<br>很喜欢<br>《不安灵魂收容所》</p><blockquote><p>“你的世界才不是MONO！”</p></blockquote><p>也送给屏幕前面的你</p><p><img src="/images/ChiliChill-2024/20241109202215.jpg" alt=""></p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Live/">Live</category>
      
      <category domain="https://ry.huaji.store/tags/Vocaloid/">Vocaloid</category>
      
      <category domain="https://ry.huaji.store/tags/%E9%9F%B3%E4%B9%90/">音乐</category>
      
      <category domain="https://ry.huaji.store/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      
      
      <comments>https://ry.huaji.store/2024/11/ChiliChill-2024/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>梦醒了，梦碎了</title>
      <link>https://ry.huaji.store/2024/08/Dear-shing/</link>
      <guid>https://ry.huaji.store/2024/08/Dear-shing/</guid>
      <pubDate>Wed, 07 Aug 2024 06:51:30 GMT</pubDate>
      
      <description>感谢你带给我的这场梦，梦醒了还是很感动</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>今天是八月的一个寻常工作日<br>我如同往常一样干着冗杂中掺杂了些无聊的工作<br>不同的是现在的我身处北京<br>自从毕业之后一直说我没有什么理由再回到这里<br>如今的我回到这个💩但却令人怀念的地方<br>乘兴而来<br>却是败兴而归<br>而过去的七月<br>也如此的不寻常</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>这个七月<br>如同一场梦一样<br>改变了家里蹲的我<br>同事的一通电话将我从计算机的知识海洋中拽回了现实<br>又如塔罗牌描绘的场景般在青城后山的溪水边相识相知<br>至此开启了新的故事<br>不过嘛<br>人一旦太顺利就容易翻车<br>爱情令人失智<br>我也命中了人生三大错觉之一<br>以为有人喜欢你<br>本以为是两情相悦<br>没想到是误会一场<br>至此二十五年来的第一次告白以失败告终<br>好在这样的误会并没有发展为矛盾<br>只不过是两边对未来的预期不一致<br>相对来说这也促成了大家各自向前一步<br>“慢慢来，不要急，时候到了会成功的”<br>可人生从不按照剧本走<br>一切都是变数</p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>转机来自于一场活动<br>应朋友邀请来到了 AdventureX 2024 黑客马拉松<br>人生的第一场黑客松<br>上次来杭州已经是十几年前的事了<br>不能说物是人非<br>只能说毫无记忆<br>一周多的旅程<br>看望了许久不见的老朋友<br>重新认识了素未谋面的新朋友<br>与三位队友共同度过了五天的时光<br>而同时打四份工的我不可谓不充实<br>但确实这样的日子是足够好玩且令人怀念的<br>甚至还有意外收获？！<br>我们获得了主题冠军与赛道二等奖<br>认识了愿意带我涉足开源领域的大佬<br>以及<br>邂逅了一段爱情</p><hr><h3 id="四"><a href="#四" class="headerlink" title="四"></a>四</h3><p>在告白被拒的第二周<br>被介绍人教育过后的我<br>本打算继续经营这份感情<br>没想到半夜出了岔子<br>晚上工作结束后和队友闲聊<br>我也不知道为什么聊到了这个话题<br>可能是半夜时分脑子宕机了吧<br>“要是没之前相识的这个姑娘，你说不定就多了个烂桃花hhh”<br>结果收到了一句反问<br>“你怎么知道是烂桃花呢？”<br>随之而来的是<br>人生二十五年来的第一次告白<br>“老头子恋爱听说像老房子着了火，烧起来没有救的。”<br>这话来自钱钟书的《围城》<br>都怪钱钟书<br>第一次面对感情生活二选一<br>毫无经验的我心跳过速伴随心率不齐<br>在床上扭动、翻滚、徘徊、乱窜<br>一夜未眠</p><hr><h3 id="五"><a href="#五" class="headerlink" title="五"></a>五</h3><p>说起来我俩之间的化学反应也蛮奇妙的<br>在刚认识的第二天我俩就互相有所心动了<br>只是都不知道罢了<br>我倒是有看出来点端倪<br>不过迟钝如我只是以为人家人好<br>完全没往这方面想<br>以至于被告白时的我<br>震惊、错愕、无语凝噎<br>而我<br>由于和之前相识的姑娘进展顺利<br>理智压过了感性<br>在杭州时心如止水<br>如湖畔大学的湖面一般平静<br>但这次不一样<br>如同窗户纸被捅破<br>阳光瞬间倾泻而下<br>“花开堪折直须折”<br>“莫待无花空折枝”</p><hr><h3 id="六"><a href="#六" class="headerlink" title="六"></a>六</h3><p>我是个做事情从不后悔的人<br>但当时的我深知<br>如果不回应这份感情<br>我会后悔一辈子<br>于是结束了与之前相识的姑娘的感情<br>说实话心里饱含歉意还挺过意不去的<br>在被介绍人痛骂了一顿后<br>进行了人生的第二次告白<br>好在这次没有被拒绝<br>至此人生篇章翻开了新的一页<br>二十五年过去了波澜不惊<br>却在一周内经历了人生第一次告白然后被拒<br>以及第一次被告白<br>我甚至都不知道对方喜欢我什么<br>我们甚至身处异地<br>是两个世界的人<br>就这么架起了一道桥梁<br>走入了对方的世界<br>就这么陷入了爱情的温柔乡</p><hr><h3 id="七"><a href="#七" class="headerlink" title="七"></a>七</h3><p>恋爱就这么出乎意料的开始了<br>甚至是如此完美的女孩子<br>“这么好的女生居然喜欢我？！”<br>无论是过往的传奇经历<br>还是为人处世的认真<br>甚至是工作事业上的专业<br>都令人着迷<br>在我眼里的她<br>又酷又可爱<br>如此的闪耀<br>如此的 Special<br>如此的与众不同</p><hr><h3 id="八"><a href="#八" class="headerlink" title="八"></a>八</h3><p>在这一切发生的一个月之前<br>我曾拜托一位会塔罗牌的朋友帮忙占卜<br>现在牌完美命中了与之前相识的姑娘的初次见面<br>而将来牌是命运之轮<br>预示着生活会因此发生转折和改变而且纠缠很深<br>我曾认为将来牌是现在牌的延续<br>但此时的我明白了将来牌描绘的是这段新的关系<br>此时的我们并不在一个城市<br>即使如恋爱菜鸟的我也深知异地不是长久之计<br>于是乎短暂思考后踏上了去北京的旅途<br>接受了命运对一个家里蹲的改变</p><hr><h3 id="九"><a href="#九" class="headerlink" title="九"></a>九</h3><p>见面后的一切都是那么的美好<br>一路上的舟车劳顿都被抛之脑后<br>初见时我们都给对方买了花<br>很惊喜很意外很开心<br>我们手牵手<br>一起漫步<br>一起闲聊<br>一起谋划未来<br>但是乐极生悲<br>危机已经在平静的外表下暗流涌动</p><hr><h3 id="十"><a href="#十" class="headerlink" title="十"></a>十</h3><p>此时距离我们的相识还不到三周<br>进展之快令周围所有的朋友咂舌<br>不少人颇有微词<br>纷纷表达了不安<br>人言可畏<br>我也被外界言论左右而开始不自信<br>在某个晚上吃饭的时候我脑子有病<br>说了些奇怪的问题和言语<br>虽然晚上回家后我想清楚道歉了<br>表达了我对她的 100% 信任<br>但此时的氛围已经十分微妙了<br>裂痕由此产生<br>而我还没有意识到问题的严重性</p><hr><h3 id="十一"><a href="#十一" class="headerlink" title="十一"></a>十一</h3><p>第二天我们的关系变得有些生疏<br>本以为是她昨晚没有休息好<br>晚上吃饭时才知道这事对她的伤害之大<br>她直言没有当场解除关系已经很不错了<br>是我的错<br>我很后悔<br>我很内疚<br>我很自责<br>那天晚上喝了不少酒<br>我一路上都在道歉<br>像个做错事的孩子<br>却是已经于事无补</p><hr><h3 id="十二"><a href="#十二" class="headerlink" title="十二"></a>十二</h3><p>第二天大家各忙各的<br>再次见面已是深夜<br>我们迎来了故事的结局<br>一周的亲密关系<br>持续 189 小时的初恋<br>就此落幕<br>那晚我们聊了很多<br>哭了很久<br>是我的错<br>我愿意尽我所能去弥补<br>但覆水难收<br>两人已回不到初见时分的模样了</p><hr><h3 id="十三"><a href="#十三" class="headerlink" title="十三"></a>十三</h3><p>正如她所说的<br>这事我还蛮下头的<br>对方如此信任我<br>而我却用质疑摧毁了这份信任<br>很抱歉伤害了一个如此亲近且信任我的人<br>我做了我能做的一切努力试图挽回<br>但双方的信任一旦被摧毁就很难再次建立<br>爱情也走向了终点<br>我曾以为在未来会遇到很多问题<br>我们都能携手解决<br>她说是啊<br>没想到刚开始就被自己人捅刀子了<br>她无法接受<br>我们打开各自世界的门走向了对方<br>她迈出了属于她的艰难的一步<br>我没能奋不顾身地保护她<br>没能给她遮风挡雨<br>却给她了迎头一击<br>我辜负了她的信任<br>我很抱歉</p><hr><h3 id="十四"><a href="#十四" class="headerlink" title="十四"></a>十四</h3><p>许多朋友会觉得因为这件小事分手不至于<br>可能是她的过往生活经历的缘故吧<br>让她还蛮容易受伤的<br>特别是我的话可能戳到她的痛处了<br>没有过往恋爱经验的我<br>口无遮拦<br>不过信任危机也不算小事<br>确实是我的全责<br>我也没什么好辩解的<br>我活该单身<br>好不容易有机会进入了亲密关系<br>而我却没抓住它<br>当时做选择时的我思考过最坏情况<br>把之前相识的姑娘拒绝了<br>和现在在一起的她分手了<br>我将一无所有<br>如今 Bad Ending 如预期般真实发生了<br>只能说我罪有应得吧</p><hr><h3 id="十五"><a href="#十五" class="headerlink" title="十五"></a>十五</h3><p>我不知道你会不会看到这些只言片语<br>我想再一次郑重的表达我的歉意<br>因为对自己的不自信和受外界言论左右<br>我质疑并伤害了你<br>辜负了你对我的信任<br>也没有注意到你的不悦和情绪变化<br>导致了现在的结果<br>我发自真心愧疚和懊悔<br>对不起！<br>覆水难收<br>我也明白你的心情<br>我不奢望你的彻底原谅<br>如果你没那么恨我了<br>希望我们能继续做朋友</p><hr><h3 id="十六"><a href="#十六" class="headerlink" title="十六"></a>十六</h3><p>说实话这件事对我的冲击其实也蛮大的<br>单身二十五年光速脱单光速分手<br>一种不真实感始终伴随着我<br>不真实的如同一场梦<br>人生如梦<br>大梦一场<br>如今梦醒了<br>梦碎了<br>世界上多了两个伤心的人<br>本以为缓缓事情就过了<br>没想到这么久了还是好难受<br>晚上睡觉梦里都是她<br>好后悔</p><hr><h3 id="十七"><a href="#十七" class="headerlink" title="十七"></a>十七</h3><p>你是第一个<br>我第一次遇到这么心动的姑娘<br>朋友们都说我动真感情了<br>那是真喜欢啊<br>不容易啊<br>今后可能再也遇不到如此特别的你了<br>感觉我很长一段时间或者一生都不会再进入亲密关系了<br>我曾是相信爱情的<br>只不过不相信它会发生在我身上<br>如今它发生了<br>我却不再相信爱情了</p><hr><h3 id="十八"><a href="#十八" class="headerlink" title="十八"></a>十八</h3><p>不知道你会不会看到这里<br>感谢你带给我的这场梦<br>梦醒了还是很感动<br>感谢这段时间的你的照顾与陪伴<br>愿你能找到属于自己的幸福的方式<br>不虚此行<br>正如那晚说的那样<br>既然你如此信任我<br>那我也应该对等的无条件信任你<br>不应有所怀疑<br>如果时间能抚平你的伤痛<br>如果你某一天还能想起我<br>如果能冰释前嫌<br>如果能给你我一个机会<br>我希望能与你一起携手<br>将这一页翻篇翻过去<br>重新书写新的篇章<br>我会不顾一切守护好你<br>守护好我的所爱之人的<br>一定！</p><hr><h3 id="十九"><a href="#十九" class="headerlink" title="十九"></a>十九</h3><p>周围亲近的朋友听闻这件事都挺唏嘘<br>也纷纷过来劝我安慰我<br>“挫折受少了，吃一堑长一智吧”<br>“良いものでも 悪いものでも 人生の経験は感謝しましょう”<br>“无论是好的东西还是坏的东西，都是人生的经验”<br>“你增长了经验！这样下一次就会慢慢长大了”<br>“往前看，多出门走走，看看会不会遇到下一个喜欢你的”<br>“爱情嘛，有第一次就有第二次，慢慢来嘛”<br>超级感谢！爱你们！<br>也感谢和她朝夕相处的室友们<br>特别是花卷<br>你们都是很 Nice 很可爱的人！</p><hr><h3 id="二十"><a href="#二十" class="headerlink" title="二十"></a>二十</h3><p>这里要特别感谢一位朋友<br>看到我在社交媒体的胡言乱语特地来安慰我<br>每个互联网平台都有你心碎的声音<br>“你现在的心态是觉得问题全在自己”<br>“因为你只能看到自己视角的问题”<br>“看到对方生气了”<br>“所以会觉得是自己的过错”<br>“但感情永远是双方的事情”<br>“但两个人相处其实真的没有对错”<br>“你的行为伤害了她”<br>“她现在的行为也让你很难过呀”<br>“都是双向的”<br>“不用觉得都是自己的问题”<br>“你也道歉了，挽回了，该做的都做了”<br>“你要多考虑自己的感受”<br>“珍惜自己的时间和心情”<br>“太卑微也会很容易让对方看轻你”<br>“让自己的道歉显得不那么珍贵”<br>“因为对方会觉得这一切是唾手可得的”<br>“别这么卑微，支棱起来，多出去见见妹子”<br>虽然我不知道是不是应该这么想啦<br>总有点恶人先告状的意味在里面（不是<br>不过听了这一番话这套说辞后<br>人真的好很多了<br>真心感谢wwwww</p><hr><h3 id="二十一"><a href="#二十一" class="headerlink" title="二十一"></a>二十一</h3><p>今天是启程离京回家的日子<br>旅途虽然很短暂<br>也算经历过有所成长吧<br>算是一点自我的慰藉吧<br>是时候离开这个伤心地了<br>见了些许久不见的朋友<br>大家都互相惊异各自的改变<br>还有蛮多朋友没有来得及见面<br>来日方长吧<br>就是不知道什么时候能再有理由回到这座城市<br>谁知道呢</p><hr><h3 id="二十二"><a href="#二十二" class="headerlink" title="二十二"></a>二十二</h3><p>临走前同一位前辈吃饭<br>前辈是过来人了<br>直接切中要害<br>我节奏不对<br>无论快还是慢<br>都没能合拍跟上节奏一起走<br>就和玩游戏一样<br>你节奏强就引领全场<br>你水平一般让别人带<br>把握机会跟着节奏来就好<br>深以为然</p><hr><h3 id="二十三"><a href="#二十三" class="headerlink" title="二十三"></a>二十三</h3><p>此时的我<br>似乎还在梦里<br>记录下的这些文字<br>亦如梦中呓语<br>初动笔时我还神色如常<br>越是回首<br>越是难受<br>越是感伤<br>越是意难平<br>此时的我已眼眶湿润<br>过往的奇妙经历印在脑海<br>不可名状的情绪萦绕心头<br>或许我应该遵循前辈的建议<br>忘掉这次的经历<br>从头开始<br>想想自己想追寻什么样的人<br>好好经营一段感情<br>嗯<br>我从不期望爱情能拯救或改变什么<br>但它所带来的变化和影响<br>我会欣然接受<br>那<br>收拾收拾<br>再出发吧</p><hr><h3 id="后日谈"><a href="#后日谈" class="headerlink" title="后日谈"></a>后日谈</h3><p>分手后半个月去求了波复合<br>说是求复合不如是求死心<br>毕竟希望渺茫<br>她似乎很逃避面对此事<br>隔了一天多才回复<br>结果是显而易见的<br>但之后聊了聊<br>原来我还没觉得<br>现在发现她自己的问题也蛮大的<br>她在 Thread 中吐槽我没想过自己的原因？<br>我也反思了半个多月啊<br>本来就是我的原因啊<br>这后悔的也是我啊<br>我也想成为可靠的天神不犯错嘛XD<br>有些事不相信就不相信了<br>我也无意质询<br>何谈强迫呢？<br>虽然后面我们沟通了并互相解释了<br>这个事算是个误会<br>聊开了也就过去了吧<br>（当时还以为她是来复合的然而并没有QAQ<br>她其实也没有做好进入亲密关系的准备<br>我俩在为人处世和交流沟通上确实也有些分歧和隔阂<br>有些问题我解决不了也无意解决<br>分开了也不是坏事<br>如果她没有意愿去沟通去改变的话<br>后续的路估计也没想象中的那么好走<br>一周后又聊了聊<br>正如一位笔友所言<br>我们没有什么实质性矛盾<br>根本上说她就是不喜欢我<br>真的足够喜欢也不会让我这么痛苦<br>大家都是人类又不是上帝<br>不用太自责<br>保持清醒<br>做好自己<br>（特别感谢这位素未谋面的兄弟特意来关心和劝导我<br>虽然很纠结<br>但最后决定就这样了<br>对她来说爱情相较于事业并不是第一顺位<br>人家不喜欢我那也没法强求<br>死心了！<br>终究是烂桃花了<br>“还以为你不会再和我说话呢”<br>我又不像她这么绝情（<br>只能说是没在对的时间相遇吧<br>现在回到最初做朋友的状态了<br>这段感情如最初预期般的不长久<br>虽然我也没料到如此短暂<br>缘分未到当朋友也挺好<br>经历这么多后还能回到原点也不差了<br>“我觉得你超好！你真的值得全心全意的爱！”<br>或许是吧<br>就像前辈说的<br>是时候忘掉这次的经历了<br>一切从未发生<br>重新开始新的人生叙事！<br>重启人生！</p><p>轻舟已过万重山<br>某天打开邮箱看到封没标题的邮件<br>“什么梦醒了，梦碎了，计算机才是你该遨游的海洋，多写点博客，加油”<br>笑着流眼泪<br>哭笑不得<br>真心感谢这位素昧平生的朋友<br>这段时间收到了蛮多类似的抚慰与支持<br>很温暖很感动<br>人间自有真情在！<br>话说人家都这么说了<br>我高低得憋一篇技术博客出来XD<br>前路漫漫亦灿灿！</p><p><strong>垚</strong><br><strong>2024.8.24 成都</strong></p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      
      
      <comments>https://ry.huaji.store/2024/08/Dear-shing/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>之乎者也</title>
      <link>https://ry.huaji.store/2024/08/Zhi-hu-zhe-ye/</link>
      <guid>https://ry.huaji.store/2024/08/Zhi-hu-zhe-ye/</guid>
      <pubDate>Tue, 06 Aug 2024 13:25:13 GMT</pubDate>
      
      <description>这可是罗大佑啊，多少年才出一个罗大佑啊</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>在朋友家用 MP3 放歌听<br>罗大佑《之乎者也》的前奏刚开始<br>朋友就被炸出来了<br>看来我们都喜欢罗大佑<br>以及这张《之乎者也》<br>知音难觅</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><blockquote><p>“你曾经对我说 你永远爱着我”<br>“爱情这东西我明白 但永远是什么”</p></blockquote><p>朋友最喜欢《恋曲1980》<br>能把爱情写出花的人很多，但是这个角度的却很少</p><p>虽然很多人都更喜欢《恋曲1990》<br>他觉得《恋曲1990》词写的一般<br>有些乱<br>可能这就是那个时代的写照吧</p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><blockquote><p>“台北不是我的家”<br>“我的家乡没有霓虹灯”</p></blockquote><p>我最喜欢《鹿港小镇》<br>一种冲击<br>一种呐喊<br>一种穿越时空的伤感</p><p>朋友说他作为农村出生的孩子<br>其实对农村生活没有什么怀念<br>父母也希望子女走入城市<br>我倒是更倾向于这是描述人的心境<br>从小地方来到大城市的感觉<br>在农村日子虽然不容易但是自由<br>来到城市生活便利了却成了牛马<br>什么样的生活是真正好的呢？<br>idk<br>我不知道</p><hr><h3 id="四"><a href="#四" class="headerlink" title="四"></a>四</h3><p>我觉得《之乎者也》唯一值得吐槽的点<br>就是大多数曲子的编曲类似容易串台<br>好几首感觉都是一个调调<br>复制粘贴稍加修改而成的<br>不过这个也可以说是他的风格吧<br>朋友是这么给我解释的XD</p><p>不得不说这张专辑里全是金曲<br>一般一张专辑里有一两首名曲就不错了<br>但《之乎者也》却是大作云集<br>时至今日也不过时<br>《恋曲1980》《鹿港小镇》<br>《童年》《光阴的故事》<br>“这是他的第一张录音室专辑，好厉害”<br>“这可是罗大佑啊，多少年才出一个罗大佑啊”</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E9%9F%B3%E4%B9%90/">音乐</category>
      
      
      <comments>https://ry.huaji.store/2024/08/Zhi-hu-zhe-ye/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>成都绕城绿道二周目</title>
      <link>https://ry.huaji.store/2024/06/Second-ride/</link>
      <guid>https://ry.huaji.store/2024/06/Second-ride/</guid>
      <pubDate>Sat, 15 Jun 2024 17:07:14 GMT</pubDate>
      
      <description>爷又回来辣！一天 115 公里！拿下！</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>时隔大半年第二次骑天府绿道<br>拉了个同事一起<br>他直接半场开香槟<br>然而还没到一般就歇逼了<br>虽然最后骑下来了<br>不过人也快没了<br>“已经是自行车的傀儡了”<br>还好租的是平把公路车<br>山地车估计更惨<br>不过说实话他这第一次的状态比我去年第一次骑绿道好多了<br>可以的<br>：“还买自行车么”<br>：“考虑一下”</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>盐丸真是好东西<br>一颗下去立马有劲了<br>：“直接带宝矿力呢”<br>：“水壶架只能放一瓶”<br>“基本上全程下来得 6 到 7 瓶水”<br>：“带个水箱x”<br>：“tank 是吧Doge”<br>：“tank 上绿道了！”<br>“铁三车上就是水箱，然后有管子直接到嘴”<br>：“你说你一个水箱，不上城门上绿道？Doge”<br>“铁三带这个干啥？给游泳池灌水？”<br>：“喝啊”<br>“水箱没那么大，是车架本身自带的”<br>“这样你就喝水就不用腾出手，可以多休息”<br>：“可以可以”</p><p>才知道绿道地面上是有标注的<br><code>K32 + 000</code> 就是距离起点 <code>32km + 0m</code><br>然后每 <code>200m</code> 标注一次<br>奇怪的知识增加了<br>正是因为这个我才知道日常骑绿道单边其实并没有超过 10 公里</p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>绿道上有个死亡弯道<br>连续的急转 加上长下坡<br>特别容易冲下去<br>据说这里出过人命<br>我直接下车推<br>安全第一<br>“以后都修锐角弯，不刹车别过x”</p><p>绿道上怎么还有钓鱼佬<br>在钓鱼，旁边放着自行车<br>新时代铁人三项</p><p>：“刚刚发现我朋友圈真有人从自行车入坑然后现在开始搞铁三了”<br>：“不用买其他太多器材了x”<br>：“买tank是吧（”</p><p>：“看见躺车了”<br>：“6 的，这玩意可不兴上下坡啊，视野不好”<br>“有一说一，如果比赛不限制自行车的样式，那就都是躺车了”<br>：“但是人家舒服啊”<br>“这玩意能装潜望镜么？潜艇那种”<br>：“不懂”</p><p>走错路了<br>差点就要到前东家的大厦了（x<br>“结果工卡没带”<br>结果过了会儿又走错了<br>绕了锦城湖一圈半<br>好多人露营<br>风景确实不错，又凉快<br>不亏的</p><hr><h3 id="四"><a href="#四" class="headerlink" title="四"></a>四</h3><p>：“车店伙计说我这链条和大盘没怎么磨损，但是 5 档 6 档飞轮快磨尖了”<br>：“每次就这两个档位是吧，我也是x”<br>：“之前稳 5 档，现在稳 6 档”<br>“他让我平时拿小盘带一下 7 档 8 档 9 档平衡一下”<br>看了下这个档位的齿比设计巧妙啊<br><code>1x4</code> 匹配 <code>2x1</code><br><code>1x5</code> 匹配 <code>2x2</code><br>以此类推<br><code>1x9</code> 匹配 <code>2x6</code><br>强啊<br>负载均衡</p><p>：“车店伙计说他刚买车的时候一个星期每天骑一整圈绿道”<br>“三个多小时，公路车”<br>：“太猛了，没看到每天”<br>：“确实猛”</p><p>发现手指关节颜色分层了<br>下午忘记补涂防晒霜了<br>手指白色<br>关节黑色<br>手背白色<br>“换一下关节均衡一下x”</p><p>走错两次路<br>下了三场雨<br>晴天阴天雨天大风天都经历过了<br>全天一共 115 公里<br>P.s. 买车十个月算上这次正好 1515 公里<br>要噶了<br>：“明天还骑？”<br>：“明天还骑就得往西天骑了x”</p><hr><h3 id="五"><a href="#五" class="headerlink" title="五"></a>五</h3><p>晚上和同事一起吃了潮汕牛肉锅<br>吃到店家打烊<br>味道不错，服务蛮好<br>我俩也聊了不少<br>回家都快 12 点了</p><p>：“佬周末什么安排啊”<br>：“睡觉”</p><p>结果第二天起来就喉咙痛了<br>晚上直接烧到 38.8 度了<br>烧起来了QAQ</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      
      
      <comments>https://ry.huaji.store/2024/06/Second-ride/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>谜拟丘六一快乐！</title>
      <link>https://ry.huaji.store/2024/05/Happy-childrens-day-to-mimikyu/</link>
      <guid>https://ry.huaji.store/2024/05/Happy-childrens-day-to-mimikyu/</guid>
      <pubDate>Sun, 19 May 2024 07:46:27 GMT</pubDate>
      
      <description>真是可爱！怎么有这么萌萌哒的宝可梦！</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>口袋迷 AG 老师的开箱视频<br>肯德基六一儿童节套餐送宝可梦的玩具<br>虽然离六一还挺久，还有接近半个月呢<br>但是<br>谜拟 Q 的那个玩具我一整个直接爱住<br>又大又好玩wwwwwww<br>（虽然官方正式中文译名是谜拟丘，但我还是喜欢这个原来的名字）<br>激烈思想斗争后下单 KFC 宅急送<br>：“开心！”<br>：“我晚上也点！”<br>预祝各位儿童节快乐！</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>拿到手才发现<br>不行了这玩意太好玩了！<br>对小朋友来说有点幼稚，但对二十多岁成年人来说刚刚好！<br>我去！谜拟 Q 真是萌萌哒！<br>于是乎拍了个视频留着六一儿童节当天发社交媒体<br>这里给各位提前偷跑一下XD</p><div style="width: 100%">    <video controls width="100%" src="/media/mimikyu.mp4" type="video/mp4"></video></div><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>：“我送的也是这个”<br>“真就大家都不要这个，没备注的都送这个是吧”<br>“符合剧情”<br>：“我还专门备注了，说如果缺货请打电话”<br>“当年谜拟 Q 人气挺高的”<br>“国内可能是大家不玩游戏不看动画所以没什么人知道”</p><p>谜拟 Q 首次登场于第七世代的《宝可梦 太阳·月亮》<br>作为系列第二十周年纪念作品<br>也算首次官方中文化的作品<br>任天堂 3DS 这么一个严格锁区锁语言的机器<br>本作能同时支持简体中文和繁体中文实属难得<br>感谢当年组织和参与中文化请愿的朋友们！</p><p>视频中 BGM 也选用了本作游戏原声集中的宝可梦中心的背景音乐<br>《ポケモンセンター》<br>“真是令人安心的音乐”</p><hr><h3 id="四"><a href="#四" class="headerlink" title="四"></a>四</h3><p>：“还没测试语音识别的触发机制是啥”<br>：“六一快乐”<br>“一定得是这个结尾”<br>：“咋识别这四个字呢”<br>“声调？”<br>：“字”<br>“语音识别”<br>“朋友，科技已经足够发达了”<br>“不是 NDS 时代只能识别音量大小了”<br>：“这玩意还能塞一个语音识别？”<br>：“这个体积都能塞个手机了，塞不下一个单片机？”<br>：“问题是价格啊”<br>：“语音识别又不是什么高端技术，AI 火起来之前也有传统方法啊”<br>“说白了就是个音频信号的字符串匹配，是吧（狗头”</p><p>后面又想了想<br>准确点来说<br>或许是个 KMP 算法？</p><hr><h3 id="五"><a href="#五" class="headerlink" title="五"></a>五</h3><p>可能有朋友会觉得谜拟 Q 有点恐怖<br>热知识<br>谜拟 Q 的本体隐藏在布偶下面<br>简单来说的身体部分才是本体<br>布偶“肚子”上的两个点其实是它的眼睛<br>它的嘴则是在布偶底部<br>上面的脑袋其实是它的画皮</p><p>这么一来<br>单看它的身体<br>是不是还挺可爱的<br>相当萌萌哒<br>（个人感觉有点像 285 号宝可梦蘑蘑菇）</p><p>“这个我知道”<br>“看到的只是一个皮囊x”</p><hr><h3 id="六"><a href="#六" class="headerlink" title="六"></a>六</h3><p>：“家附近和公司周围 KFC 的线上线下都没货了”<br>“好在昨天点了一单”<br>：“提供代吃服务，我这儿店多（x”<br>：“玩具也给吃了是吧”<br>：“那不至于，我又不是卡比兽”<br>：“星之卡比”<br>：“也是卡比”</p><p>这次联动一共五个玩具<br>去掉耿鬼之后<br>剩下四个正好是孤独摇滚的四个颜色</p><p>讲真我小时候要是 KFC 有这么好玩的玩具<br>我必定得拉着家长连吃五顿<br>直到给所有玩具凑齐<br>嚯！</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      
      
      <comments>https://ry.huaji.store/2024/05/Happy-childrens-day-to-mimikyu/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>震惊！朋友圈里竟然有...</title>
      <link>https://ry.huaji.store/2024/05/Amazing-moments/</link>
      <guid>https://ry.huaji.store/2024/05/Amazing-moments/</guid>
      <pubDate>Sun, 05 May 2024 14:06:54 GMT</pubDate>
      
      <description>Amazing! the Moments...</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>很抱歉用这么标题党的方式把您骗进来，不过这事确实挺震惊的XD</p><p>五一小长假即将结束，在家躺着的我刷到了家母的朋友圈<br>（虽说博客使用书面语没错啦，但总觉得家母这个谦称没令堂这个敬称好听，下面还是用口语吧）</p><p>第一眼：???啥玩意???<br>第二眼：¿¿¿发生什么了¿¿¿<br>第三眼：乐！我要立即向全世界传播这段希望的影像！</p><p><strong>简单来说，我妈妈在朋友圈发了个九宫格照片，内容是漫展的 Coser 场照！！！</strong></p><p><img src="/images/Amazing-moments/20240504210536.jpg" alt=""></p><p>她这不是穿越了，我才是穿越了（x<br>后面问了下，我爸妈那天去车展，逛完出来旁边是漫展，就顺便一起逛了<br><strong>她甚至有和 Coser 合影，还表示很遗憾没能进去逛逛！</strong><br>笑死，我说下次我亲自带你逛hhhhh</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>这事收获了周围人的各式评论：</p><blockquote><p>“二次元一家”</p></blockquote><blockquote><p>“你爸妈也太开明了吧，真羡慕”</p></blockquote><blockquote><p>“包容度还怪高的，下次带我爸妈去看看”</p></blockquote><blockquote><p>“阿姨还怪可爱的，下次撺掇阿姨出一个”<br>“笑死，下次试试”</p></blockquote><blockquote><p>“难以想象是四十岁人的精神状态”<br>“啊，您好，今年五十六了”<br>“更难想象了”</p></blockquote><blockquote><p>“好巧，今天还去玩了一会儿”<br>“乐，我在家待一天了，感觉我才是老年人（x”</p></blockquote><p>甚至还有我爷爷奶奶这一辈的长辈发评论点赞的（乐</p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>说实话这件事在我看来挺出乎意料的<br>工作这几年感觉我爸妈对各种新生事物和年轻人的潮流文化接受程度相当高<br>小时候和学生时代都没什么感觉的<br>二老真是越活越年轻了</p><p>不过细想这事应该也算意料之中吧<br>从我在家摆了一柜子手办这事就可见一斑<br>前段时间我还送了个手办给我妈<br>起因是之前摆龙门阵时她看到有个手办挺好看的<br>于是乎我就订了，然后前段时间到货了<br>现在被摆在我家那个进门就能看到的架子上了XD</p><p>与此同时他俩对我留长头发和“奇装异服”之类的事情完全没有阻止<br>（叠个甲，这里的“奇装异服”并不属于违反公序良俗的那一类，至少说穿出门完全不会引人注目）<br>虽然有时候我妈会锐评我的某些穿搭不好看，不过也不会多说什么<br>感觉他们年轻时候比我们现在 fashion 多了，现在这些都是当年他们玩剩下的hhhh</p><p>讲真当时和他俩聊这些的时候<br>我觉得他俩不说是明令禁止吧，也得是个激烈反对<br>结果，就这？<br>现在想起来这些事我还蛮感动的wwwwwww</p><p>以及我妈甚至对 LGBTQ+ 这类不属于当下国内主流的版本都表示了一定程度的理解与接受<br>这么说我也算某种意义上的家长党了？<br>然而很遗憾我并不是，buff 用不上咯（笑</p><p>之前和朋友聊天聊到我家的家庭氛围时，我的论断是<br>“我家属于开明，但是没有那么开明”<br>“典型的比上不足比下有余那种”<br>现在看来这样已经足够了<br>适合的才是最好的<br>蛮好，十分感谢！<br>爱你们！</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      
      
      <comments>https://ry.huaji.store/2024/05/Amazing-moments/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>【推しの子】 / 【我推的孩子】 / 推子</title>
      <link>https://ry.huaji.store/2024/04/Oshi-no-ko/</link>
      <guid>https://ry.huaji.store/2024/04/Oshi-no-ko/</guid>
      <pubDate>Thu, 04 Apr 2024 17:51:47 GMT</pubDate>
      
      <description>说来惭愧，我其实已经很久没正儿八经的看过TV动画了，算下来可能有两三年了</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>说起来我其实已经很久没正儿八经的看过TV动画了<br>算下来可能有两三年了<br>仅有的几个还是经典作品反复观看<br>说来惭愧<br>我推的孩子这部作品本来去年秋天就应该看的<br>被某位朋友按头安利<br>然后就被我拖到了现在<br>丢人，不愧是我.jpg</p><p>其实看本作之前<br>我一直以为作品名我推的孩子里面的“推”是个动词<br>“怎么现在都开始讲小孩子当偶像的故事了？”<br>笑死</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>看完这剧场版第一集后没啥感想<br>“6”<br>说好吧也不坏<br>炸裂中透露着合理<br>有点意思<br>让人期待后续故事<br>悬疑+花里胡哨中又带着深刻<br>有修饰但写实的职场番（？<br>不愧是赤坂明和横枪萌果老师能整出来的活<br>第一集能上院线那确实做得牛逼<br>歌也好听<br>有空继续看</p><p>第四集故事真好啊<br>我都看落泪了<br>帽皇好可爱wwwwwww</p><p>第五集开头吐槽一针见血啊<br>说有马加奈这样的女孩特别受油腻死宅的欢迎<br>我：“确实（笑）”</p><p>第六集看得好揪心啊<br>女王蜂的 ED 真的绝配<br>太特喵好听了<br>剧情中各种神插入<br>回过味了才发现是进 ED 了<br>比 OP 好不少<br>怪不得之前能吵起来（</p><p>哭哭<br>第七集真好哭<br>结尾也是猝不及防<br>高桥李依上身了（大误）</p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>本来说一口气看完的<br>然后就拖了半个月<br>毕竟这段时间发生了不少事<br>也没什么闲暇时间<br>今天为了看这个还专门给眼镜戴上了<br>眼睛色域++<br>我也有星星眼了（x</p><p>时不时闪现的人物作画特写还挺对胃口（<br>妹妹露比好让人跳戏虹夏啊XD</p><p>赤音和茜居然是一个读音<br>日本人果然是起名先发音后找字啊hhhh</p><p>国内什么时候拍高中生谈恋爱的综艺啊<br>GKD! GKD!<br>“带家长的那种是吧”<br>“我都能想象了”<br>“上来先是家境介绍”<br>“然后是展示学习成绩和课余兴趣（还得和大众拉开差距）”<br>“最后是一说二次元全场灭灯x”<br>我：“不要啊！！！”</p><p>第八第九集由于之前了解过故事走向<br>所以有些意料之内<br>话说帽皇你这歌听完就忘<br>怪不得火不了（x<br><del>“中央已经决定啦，你来当 C 位！我一个过气童星怎么到 B 小町来了呢？”</del></p><p>“新人偶像 有马加奈”<br>最后一集动画工房你高低得给我整个大的<br>（话说为啥只有十一集，第一集太长了？）</p><p>最终话<br>大了<br>但是不够大<br>Live 有点断断续续<br>制作组里肯定有加奈厨<br>傲娇还有市场！<br>作为结尾来说有点平淡了<br>快进到女人打架（没有</p><hr><h3 id="四"><a href="#四" class="headerlink" title="四"></a>四</h3><p>完结撒花！<br>本来想给到 9 分<br>不过后面确实有点不及预期<br>8 分！<br>值得一看！</p><p>感谢安利我这部作品的这位朋友<br>“整体来说观感很好，加奈简直就是另外一个我”<br>怪不得你这么喜欢有马加奈<br>你们还真有点像wwwwwww<br>摸摸<br>相信我，会有人单推你的！</p><p>二期放送时间也公布了<br>2024 年七月番<br>让我们到时候再见咯！</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E5%8A%A8%E7%94%BB/">动画</category>
      
      
      <comments>https://ry.huaji.store/2024/04/Oshi-no-ko/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>这里没有什么 2023 年终总结</title>
      <link>https://ry.huaji.store/2024/02/Summary-2023/</link>
      <guid>https://ry.huaji.store/2024/02/Summary-2023/</guid>
      <pubDate>Tue, 27 Feb 2024 20:18:46 GMT</pubDate>
      
      <description>严格来说我并不愿意将这篇文章称作为年终总结</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>严格来说我并不愿意将这篇文章称作为年终总结。其一是 2024 年已经过去了六分之一，就算是龙年现在也已经过了大年，写年终总结着实是有些晚了。二者作为一个有严重拖延症的人，自从这个博客建立的那一年，我就把写年终总结这事排上了日程。结果呢？当时是把这份永远不会实现的日程给删掉咯XD</p><p>上一篇正儿八经的博文已经是半年前了，我一度也想放弃写这玩意的想法，不过作为一位网站维护者，长期没有新鲜血液并不是一件我觉得妥当的事。正好半年前的八月我也决定开始留长发，起因是某不到三十的朋友决定去植发。这事给了当时的我巨大的心灵震撼，完全不亚于某尚未毕业的实习生已经结婚好几年一事给我的冲击。于是我抱着“只要头发够长就不显秃”的想法开始了留头发。如今这事已经和初心相差甚远，当然这已是后话了。</p><p>再往前一年的八月也是一个重要的时间点，因为我开始写日记了。由于过往的一些经历我十分厌恶写日记，不过现在看来只要控制字数写写流水账也挺有意思的，至少它极大的缓解了我的精神内耗，有类似困扰的朋友也可以试试wwwwww截止今天更新日记的 Twitter 上已经有 20 个粉丝了，每天有人点赞这事还蛮意料之外的。在此十分感谢这些萍水相逢的朋友，如果屏幕前的你看到了这些胡言乱语的文字也欢迎告诉我hhhh</p><p>所以说这篇文章其实就是废话加强版的流水账日记，大多数朋友看到这里可以直接退出了，与其眯眼休息几分钟也比在这里看我絮絮叨叨强。大家平时已经很辛苦了，就不要把生活搞的这么累，得多休息，是吧？</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>回头看毕业后这几年，每一年我的变化都是巨大的，包括但不限于外貌、语言习惯、生活方式以及精神状态。经常会有人问我你咋变这个样子了，在反复自我审视中我归纳出了四个字：</p><blockquote><p><strong>“上班上的”</strong></p></blockquote><p>当然这里说的上班并不是贬义词。虽然我不喜欢上班（特别是在过完年的现在），但是班还是要上的，人嘛总得给自己找点事做，况且还得挣钱吃饭呢23333上班这个词的褒贬转化其实在我换工作那一刻就完成了，换工作这个决定一如当年放弃保研的决定一样让挺多人觉得我脑子有坑。不过就目前我的观察来看这两个决定对我来说都是足够正确的，或者真正的全局最优解只存在于平行宇宙中吧。</p><p>相比起之前在互联网的日子，现在的日子好到有些不真实了。如某位朋友当时吐槽说我自从毕业就没说过工作上的开心事，现在再也没这个情况了，因为工作在生活中的占比已经大大减少了。反倒是回旋镖打到这位朋友身上了，自从入职以来相比我当时的症状有过之而无不及啊（笑）。说起工作，最近我也接住了当年扔出去的回旋镖hhhh以两个通宵加班的代价和当年刚上大二的我和解了，原来有些事情真不是我的问题，锅也不应该我背，释然了。</p><p>虽然有时也会觉得我这么混日子是不是太摆烂了，特别是最近做新年展望的时候同事说我应该多 show 多 report 。不过既然选择了跳出来那就代表着奋力往上爬这条路已经不再可选了，不然留在原来的组说不定现在我已经年薪百万了（并没有）。还是那句话，个人努力固然重要，但还得看历史的进程啊。</p><p>聊到工作话题必然逃不开裁员。前有隔壁整组被裁，后有老板画饼大力招人，搞得我都对这种消息免疫了。我被裁了怎么办？该给钱给钱，该滚蛋滚蛋！说不定后面会出去读个博，谁知道呢？希望我不是在开玩笑hhhh</p><p>这里也希望各位打工人找到属于自己的生活工作的平衡点吧，减少上班的痛苦，也希望还没成为社畜的朋友早日加入到这份痛苦之中（笑）。</p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>2023 年对我来说还是挺“魔幻”的一年，虽说今后的每一年都可以用这个形容词就是了XD不过翻翻相册总会觉得那些过往已经很遥远了。</p><blockquote><p>出了两次远门，看了些不一样的风景，听了点不一样的故事。感谢某人的不杀之恩，帮我度过了那段混沌的状态。</p></blockquote><blockquote><p>结识了好几位新朋友，有了一些羁绊也少不了离别。感谢各位的陪伴，我也“萌生了多余的情感”（大误）。</p></blockquote><blockquote><p>见到了不少老朋友，欢迎大家来成都玩XD也有许久未联系的，几家欢喜几家愁啊。</p></blockquote><blockquote><p>捡起了曾经的许多爱好。给家里增添了不少生活气息，不止一位来过我家做客的朋友如此评价（开心）。</p></blockquote><blockquote><p>作为一个死肥宅家里蹲程序员，也开始会出门走走逛逛街啥的了（真的很难得好吧）。</p></blockquote><blockquote><p>买了辆自行车！游泳也安排上了！然后膝盖废了QAQ《冬已去，春未来》，现在就等春天了。</p></blockquote><blockquote><p>外表变了不少（奇怪的风格增加了！），虽然过个年又吃胖了，今年再接再厉吧。</p></blockquote><blockquote><p>意外的得到了一些机会和垂青，挣了点外快。</p></blockquote><blockquote><p>家里多了不少花花绿绿的东西，钱包表示很难顶5555</p></blockquote><blockquote><p>解决了一个压在心头许久的破事，虽然花费了大价钱，就算是破财消灾吧，至少这件事之后我整个人轻松了不少，毕竟之前近一半的外部压力来自于此，我免费啦！</p></blockquote><blockquote><p>参加了两次公费出游（？），虽然尬的抠脚，不过也是难得的消遣了。</p></blockquote><blockquote><p>大病没有小病不少，开始了身体改造（指看牙），没事就往医院跑。不过也算是好事啦，健康指数上升了！</p></blockquote><blockquote><p>对象？当然没有啦，这不是很正常么。最躁动的日子已经过去了，现在早已不像之前那么着急了，过好自己的生活才重要。有独自过好一辈子的能力和决心才能更好的迎接两个人的生活嘛XD</p></blockquote><blockquote><p>催婚？我直接反客为主！也欢迎屏幕前的各位帮我介绍，事成之后我发大红包！</p></blockquote><blockquote><p>许多朋友都在过年期间带着对象回家见家长了，祝福大家！不知道人生的第一份婚礼礼金会花落谁家呢（期待）？现在就等着参加大家的婚礼顺便全国到处玩了wwwwww</p></blockquote><p>写到这里的时候我去翻了过去一整年的日记，虽然是流水账却真的给摆烂的生活留下了不少痕迹，蛮欢乐的（笑死我了好吧），看到文字仿佛昨日重现。近来的日常生活和精神状态真的好了超级多，也算是达成了去年的目标吧：</p><blockquote><p><strong>“情绪平淡，一点点就好”</strong></p></blockquote><p>今年的目标已经更新到主站的问答里了，希望能如愿233333</p><hr><h3 id="四"><a href="#四" class="headerlink" title="四"></a>四</h3><p>按我以往的尿性这篇文章肯定不会就此打住，大概率是写着写着天就亮了，但是介于明天要上班和写日记解决了我绝大部分的表达欲，我觉得还是就此收手吧（乐）。</p><p>今年是闰年，马上也要到四年一度的 2 月 29 日了，愿您在下次遇上这个日子的这段时光之中做一个认真生活的人！开心一点嘛，笑一个咯（笑）。</p><p>写到这里的时候音乐正好是《Hand in Hand》，也该难忘今宵了。</p><p>晚安！下次见！</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      
      
      <comments>https://ry.huaji.store/2024/02/Summary-2023/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>拔牙小记</title>
      <link>https://ry.huaji.store/2023/08/Tooth-extraction-note/</link>
      <guid>https://ry.huaji.store/2023/08/Tooth-extraction-note/</guid>
      <pubDate>Sun, 27 Aug 2023 09:40:07 GMT</pubDate>
      
      <description>纪念两颗智齿与受重伤的钱包</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>去拔牙<br>人好多<br>好害怕<br>还好贵<br>一颗智齿一千五<br>然后还有一颗智齿要拔<br>严格来说一共六颗牙<br>哭了</p><p>等拔牙的时候其实是最可怕的<br>恶趣味爆发<br>开始找朋友骗照片<br>结果<br>“嘿 您看看 您怎么不早说呢”<br>“快快快 里面请”<br>“完了 我们亲爱的 X 先生 他确实进去了”<br>“功率全开的无影灯、滋滋作响的冲洗器、冰冷的柳叶刀无一不在拷打着他的体魄 而他的苦痛与磨难又何尝不是我们的煎熬”<br>“老 X ——！”<br>“尼玛的，你退出文坛就是文坛的损失”<br>“你当时跳到桌子上叫的最欢”</p><p>当然最后还是骗到几张<br>看了漂亮妹妹就能安心上路了<br>好人一生平安</p><p>拔牙其实整体还好<br>过程中也不算疼<br>就是麻药过了之后<br>有种幻肢痛<br>妈妈生的（即答）</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>第二天早上起来牙还好<br>人不太好<br>整了点花活还是不太好<br>急求<br>有没有什么纯爱片给我治愈一下</p><p>“而你，我的朋友，你是真正的英雄！”<br>“赠人玫瑰 一支八百”<br>“不是”<br>“手有余香 你懂我意思吧”<br>“下次见到你我给你塞玫瑰塞到你破产好吧”<br>“啧 现在喜欢给男的送玫瑰是吧”<br>“你最终还是没有守住阵地啊 我的朋友”<br>“？”</p><p>（最后还是有收获的<br>父母爱情<br>去有风的地方<br>放学后失眠的你<br>原声带<br>宅男腐女恋爱真难<br>相合之物<br>会社と私生活<br>一堆漫画和弔图（与其相信这个存在，不如相信你是秦始皇（指善良地雷系青梅竹马<br>当然还有中国式英雄登场！<br>扔出了 STARS 和 774 （样子一般但是氛围满分！要的就是这种感觉（笑）乍看还以为是电视综艺（然后开始了分享大会<br>感谢这六位朋友！<br>有好的纯爱作品也欢迎推荐<br>谢谢英雄！</p><p>想着给保持器还是带上吧<br>试了一下发现没问题<br>结果第二天起来发现压着伤口了<br>全是血<br>悲<br>还是等几天吧</p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>一周时间到了<br>去拆线<br>看前面的患者操作了好久<br>用剪刀剪断线头然后取出<br>到了我<br>三十秒就结束了<br>“？这么快，前面那位不是挺多线头么，我这就一下？”<br>“你俩难度不一样”</p><p>然后是打印病例的事<br>换了新系统<br>先是系统卡死<br>后是打印出来格式不对<br>辣鸡开发</p><hr><h3 id="四"><a href="#四" class="headerlink" title="四"></a>四</h3><p>上午陪周老师和朋友见诸葛丞相<br>下午去拔第二颗牙<br>第一次在签到时间前到医院<br>遇到个妹子聊了一会儿<br>可惜没加个联系方式</p><p>叫号屏幕上的三个字姓名中间会用星号代替<br>显示有个人名字和我就姓氏不一样<br>还以为我名字又被打错了<br>有个朋友名字是两个字的<br>上次他去看病的时候姓和名是分开显示的<br>直接展示完了<br>完全没有隐私</p><hr><h3 id="五"><a href="#五" class="headerlink" title="五"></a>五</h3><p>我是下午第一个<br>但是上午还有五个没看完<br>所以等了好一会儿<br>这次打麻醉的医生有点手生<br>导致拔牙过程中比上次痛不少<br>不过术后反应比之前小多了<br>可能是身体适应了吧</p><p>去交钱的时候刷银行卡失败了<br>还吞了我医保卡上的钱<br>不过最后还好退回来了<br>但是没要到发票<br>听闻是财政系统升级<br>下次去拆线的时候再拿吧<br>还有病历<br>不愧是成都消费水平最高的地方之一（x</p><hr><h3 id="六"><a href="#六" class="headerlink" title="六"></a>六</h3><p>上次拔牙拔左边<br>我就喜欢侧躺左边睡<br>这次拔右边<br>我又变成侧躺右边睡<br>主打一个叛逆</p><p>三天之后我脸还是有点肿<br>我是脸肿字幕组（x</p><hr><h3 id="七"><a href="#七" class="headerlink" title="七"></a>七</h3><p>拆线那天<br>正好约了一个好久没见的朋友<br>我说喝个茶吧<br>结果这货神戳戳要吃火锅<br>下午三点吃火锅<br>我还是带电脑上班状态<br>Work From Hotpot<br>有毒<br>然后吃了四个小时吃到了七点</p><p>朋友圈吐槽这个事<br>没注意那天七夕<br>评论区开始各种起哄<br>我本来说评论一下我和男的吃的<br>想了一下<br>不对<br>这我岂不是更加说不清了<br>成都真是个可怕的地方啊</p><p>吃完之后第二天牙没事<br>不过牙旁边的肉有点疼<br>外加肚子不太行了<br>吃火锅吃的（</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      
      
      <comments>https://ry.huaji.store/2023/08/Tooth-extraction-note/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>ChiliChill 2023「每到夜里」全国巡演</title>
      <link>https://ry.huaji.store/2023/07/ChiliChill-2023/</link>
      <guid>https://ry.huaji.store/2023/07/ChiliChill-2023/</guid>
      <pubDate>Sat, 01 Jul 2023 21:02:21 GMT</pubDate>
      
      <description>一场久违的 Live 与奇妙的后续体验</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>好多人<br>入场排队好多人<br>场贩周边好多人<br>没想到的是<br>最多的还是排签售的<br>围着场馆绕了一圈</p><p>先来先进场<br>先进场就能站前排<br>但是有代价的<br>有两个抢到第二排的朋友他们提前了六个小时来<br>可怕</p><p>这两位还是学生<br>川大数学系的<br>（说学校名字的时候十分小声，毕竟最近名声不好<br>原神入坑<br>第一次来十分激动<br>带了相机来<br>还帮我拍了照<br>感谢二位</p><p>入场给手背盖章<br>手机没拿稳<br>“PIA 叽~~”<br>还好手机没事</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>场馆里好热<br>乌泱泱全是人<br>从来没有如此迫切地希望自己长高十厘米</p><p>“在 Live 录像的都是不认真看的（暴论）”<br>今天才知道<br>举手机不一定是录像<br>还可以当望远镜使<br>（虽然我也拍了</p><p>于老师在舞台上发挥稳定<br>感觉像听脱口秀（不是<br>不仅教新生代朋友如何拆专辑取 CD<br>还教不常来 Live 的朋友喊安可<br>“夏老师！夏老师！”<br>“于老师！于老师！”<br>“退票！退票！”<br>他真的，我哭死</p><p>夏老师唱到后面已经有些体力不支了<br>饿魔少女缺少了灵魂的最后一句<br>“不了！今天不…… 19 串吧”</p><p>“会不会唱《神仙说他也不懂》啊”<br>“这种商业曲 + 早期冷门作品应该不会出现在 Live 吧”<br>一首曲落<br>第二首就是<br>我超喜欢这首的<br>心想事成<br>全场最激动的时刻</p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>观众分三种<br>听 Vocaloid 入坑的<br>听流行音乐的<br>玩原神的<br>（不愧是原神御用音乐创作人<br>如何区分<br>看他们什么时候举起手机拍照录像就知道了</p><p>听闻纯白也来了<br>（我是不是应该也带他专辑找他签一个啊<br>我还带了第一张专辑<br>听闻周围好多人都想买<br>闲鱼都翻了三四倍了<br>我这带签名的直接晋升理财产品</p><p>“中 V 曲和专辑会有么”<br>“会有的，后面有灵感会做的”<br>开心<br>（虽然这话已经说两年了</p><p>排完签售已经十一点半<br>腰疼<br>好久没这么长时间站立了<br>该回家躺两天了</p><hr><h3 id="四"><a href="#四" class="headerlink" title="四"></a>四</h3><p>结果回家找了 LM 吃宵夜<br>附近找了个烧烤店<br>中间老板十分热情（严格来说是二老板）<br>送了牛肉送了毛豆花生<br>虽然言论有点傻逼就是了<br>不过好在味道还不错<br>后面还会来的</p><p>烧烤一路吃到了半夜四点<br>回家的时候小区门还锁了<br>包了小区一圈才回家<br>路上看到个画鬼脸的消防栓<br>半夜看着十分可怕</p><p>和 LM 聊了半宿<br>扯了不少有的没的<br>和人交流还是很能缓解精神内耗的<br>总之祝贺你找到新工作吧<br>一切会好起来的<br>也感谢你听我聊这些乱七八糟还不容易开口的东西<br>晚安</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Live/">Live</category>
      
      <category domain="https://ry.huaji.store/tags/Vocaloid/">Vocaloid</category>
      
      <category domain="https://ry.huaji.store/tags/%E9%9F%B3%E4%B9%90/">音乐</category>
      
      
      <comments>https://ry.huaji.store/2023/07/ChiliChill-2023/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>周日</title>
      <link>https://ry.huaji.store/2023/06/Sunday/</link>
      <guid>https://ry.huaji.store/2023/06/Sunday/</guid>
      <pubDate>Sun, 04 Jun 2023 15:43:30 GMT</pubDate>
      
      <description>日常 &amp;&amp; 电影 &amp;&amp; 书籍</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>《天空之城》<br>周六晚上的最后一场<br>本来是想拉 Ayako 一起去的<br>结果他说他看过太多遍了<br>分镜都能背下来了</p><p>影院环境其实一般<br>好在巨幕厅也没什么人<br>回家一查才知道是 1986 年的作品<br>令人惊异的是<br>即使是快四十年前的老家伙<br>在当下仍不过时<br>也不妨碍我花 20 块钱去电影院里做两个小时纯粹的孩子</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>昨晚做梦<br>醒来之后还在为梦里的我操心各种事<br>然后发现是梦，原来我不用担心<br>然后开始想各种今天要做的事情<br>最后发现今天是星期日，不用上班<br>还蛮可笑的<br>我确实有些太过焦虑了<br>怎么回事呢<br>之前工作忙的时候也没这样啊<br>也可能只是我遗忘了</p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>北岛和顾城<br>我高中时期很喜欢的作家<br>时隔六七年<br>又一次翻看他们的作品<br>《蓝房子》<br>《顾城哲思录》<br>看的蛮入迷<br>不同的是<br>坐在沙发上<br>读着书<br>嘴角挂着笑<br>眼角挂着泪</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      
      <category domain="https://ry.huaji.store/tags/%E5%8A%A8%E7%94%BB/">动画</category>
      
      
      <comments>https://ry.huaji.store/2023/06/Sunday/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>一些有用的文档：2020-5-12 %版</title>
      <link>https://ry.huaji.store/2023/04/Some-useful-documents-template/</link>
      <guid>https://ry.huaji.store/2023/04/Some-useful-documents-template/</guid>
      <pubDate>Sat, 22 Apr 2023 17:57:45 GMT</pubDate>
      
      <description>2020.5.12 一份可以用于 ACM 和 OI 的模版，感谢付老师、小黄老师、郑老师和 QDD 的大力滋兹Orz</description>
      
      
      
      <content:encoded><![CDATA[<p><a href="https://github.com/dongshunyao/some-useful-documents" target="_blank" rel="noopener">GitHub地址</a></p><p><strong>公式部分请见Github</strong></p><p><em>2020.5.12</em></p><p><em>2023.4.23</em></p><hr><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p><em>一份可以用于 ACM 和 OI 的模版，有问题或建议请留言QAQ</em></p><p><em>不断更新（<del>挖坑</del>）中</em></p><p><em>感谢付老师、小黄老师、郑老师和 QDD 的大力滋兹，Orz%%%</em></p><hr><h3 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h3><ul><li><a href="#2020-5-12-版">2020-5-12 %版</a><ul><li><a href="#前言">前言</a></li><li><a href="#目录">目录</a></li><li><a href="#基础">基础</a><ul><li><a href="#通用模版">通用模版</a></li><li><a href="#性能测试">性能测试</a></li><li><a href="#玄学优化">玄学优化</a></li><li><a href="#手动扩栈">手动扩栈</a></li><li><a href="#输入输出">输入输出</a><ul><li><a href="#特殊格式与转换">特殊格式与转换</a></li><li><a href="#精度控制">精度控制</a></li><li><a href="#挂">挂</a></li></ul></li><li><a href="#参考">参考</a><ul><li><a href="#ascii表">ASCII表</a></li><li><a href="#常用数表">常用数表</a></li><li><a href="#时间复杂度与数据规模">时间复杂度与数据规模</a></li></ul></li></ul></li><li><a href="#数学">数学</a><ul><li><a href="#常用网站">常用网站</a></li><li><a href="#数学理论">数学理论</a><ul><li><a href="#负数求余">负数求余</a></li><li><a href="#组合数">组合数</a></li><li><a href="#错位排列数">错位排列数</a></li><li><a href="#威尔逊定理">威尔逊定理</a></li><li><a href="#费马小定理">费马小定理</a></li><li><a href="#费马大定理">费马大定理</a></li><li><a href="#哥德巴赫猜想">哥德巴赫猜想</a></li><li><a href="#勾股数">勾股数</a></li><li><a href="#抽屉原理">抽屉原理</a></li><li><a href="#欧拉公式">欧拉公式</a></li></ul></li><li><a href="#欧几里德算法">欧几里德算法</a><ul><li><a href="#最大公约数-gcd">最大公约数 GCD</a></li><li><a href="#扩展欧几里德算法-exgcd">扩展欧几里德算法 EXGCD</a></li></ul></li><li><a href="#欧拉">欧拉</a><ul><li><a href="#欧拉函数">欧拉函数</a><ul><li><a href="#定义">定义</a></li><li><a href="#性质">性质</a></li><li><a href="#求法">求法</a><ul><li><a href="#直接求">直接求</a></li><li><a href="#线性筛法">线性筛法</a></li><li><a href="#递推法">递推法</a></li></ul></li></ul></li><li><a href="#欧拉定理">欧拉定理</a></li><li><a href="#欧拉降幂">欧拉降幂</a></li><li><a href="#欧拉路径">欧拉路径</a><ul><li><a href="#欧拉回路">欧拉回路</a></li><li><a href="#欧拉路径-1">欧拉路径</a></li></ul></li></ul></li><li><a href="#杜教筛">杜教筛</a></li><li><a href="#扩展大步小步-baby-steps-giant-steps">扩展大步小步 Baby Steps Giant Steps</a></li><li><a href="#二次剩余">二次剩余</a></li><li><a href="#快速傅里叶变换-fft">快速傅里叶变换 FFT</a><ul><li><a href="#多项式乘法">多项式乘法</a></li><li><a href="#相同位数整数乘法">相同位数整数乘法</a></li><li><a href="#任意整数乘法">任意整数乘法</a></li></ul></li><li><a href="#快速幂">快速幂</a></li><li><a href="#斐波那契数列">斐波那契数列</a></li><li><a href="#素数">素数</a><ul><li><a href="#试商法">试商法</a></li><li><a href="#打表法">打表法</a></li></ul></li><li><a href="#素因子">素因子</a><ul><li><a href="#直接求-1">直接求</a></li><li><a href="#打表法-1">打表法</a></li></ul></li><li><a href="#逆元">逆元</a><ul><li><a href="#定义-1">定义</a></li><li><a href="#求法-1">求法</a><ul><li><a href="#费马小定理-1">费马小定理</a></li><li><a href="#扩展欧几里得法">扩展欧几里得法</a></li><li><a href="#打表法-2">打表法</a></li></ul></li></ul></li><li><a href="#中国剩余定理">中国剩余定理</a></li><li><a href="#整数运算">整数运算</a><ul><li><a href="#大整数">大整数</a></li><li><a href="#自动取模">自动取模</a></li></ul></li><li><a href="#求n的最后一位的非0数">求N!的最后一位的非0数</a></li><li><a href="#星期问题">星期问题</a></li><li><a href="#计算几何">计算几何</a><ul><li><a href="#pick-公式">Pick 公式</a></li><li><a href="#已知圆锥表面积s求最大体积v">已知圆锥表面积S求最大体积V</a></li><li><a href="#常用">常用</a></li><li><a href="#凸多边形宽度">凸多边形宽度</a></li><li><a href="#凸包图形交点交线数学半平面交">凸包,图形,交点,交线,数学,半平面交</a></li></ul></li></ul></li><li><a href="#二进制">二进制</a><ul><li><a href="#状态压缩">状态压缩</a></li><li><a href="#lowbit函数">lowbit函数</a></li></ul></li><li><a href="#动态规划-dp">动态规划 DP</a></li><li><a href="#二分">二分</a></li><li><a href="#三分">三分</a></li><li><a href="#数据结构">数据结构</a><ul><li><a href="#并查集">并查集</a></li><li><a href="#单调栈">单调栈</a></li><li><a href="#区间最值查询-rmq">区间最值查询 RMQ</a></li></ul></li><li><a href="#字符串">字符串</a><ul><li><a href="#最长回文串">最长回文串</a></li><li><a href="#hash处理">Hash处理</a><ul><li><a href="#全字符集">全字符集</a></li><li><a href="#小写字母集">小写字母集</a></li></ul></li><li><a href="#字符串匹配">字符串匹配</a><ul><li><a href="#kmp">KMP</a></li><li><a href="#扩展kmp">扩展KMP</a></li><li><a href="#ac自动机">AC自动机</a><ul><li><a href="#快速版">快速版</a></li><li><a href="#完整版">完整版</a></li></ul></li></ul></li><li><a href="#最长上升子序列-lis">最长上升子序列 LIS</a><ul><li><a href="#动态规划">动态规划</a></li><li><a href="#二分查找优化">二分查找优化</a></li></ul></li><li><a href="#后缀数组">后缀数组</a></li><li><a href="#编辑距离">编辑距离</a><ul><li><a href="#定义-2">定义</a></li><li><a href="#解法">解法</a></li><li><a href="#实现">实现</a></li></ul></li></ul></li><li><a href="#排序">排序</a><ul><li><a href="#快速排序">快速排序</a></li><li><a href="#归并排序">归并排序</a></li></ul></li><li><a href="#搜索">搜索</a><ul><li><a href="#n皇后">N皇后</a></li><li><a href="#bfs-队列版本">BFS 队列版本</a></li></ul></li><li><a href="#c">C++</a><ul><li><a href="#引用">引用</a></li><li><a href="#范围for">范围for</a></li><li><a href="#列表">列表</a></li><li><a href="#二进制读写">二进制读写</a></li><li><a href="#头文件">头文件</a><ul><li><a href="#-__builtin--内建函数">&lt; __builtin &gt; 内建函数</a></li><li><a href="#-cmath--数学函数">&lt; cmath &gt; 数学函数</a></li><li><a href="#-random--随机函数">&lt; random &gt; 随机函数</a></li><li><a href="#-cctype--字符类型">&lt; cctype &gt; 字符类型</a></li><li><a href="#-cstring--c字符串">&lt; cstring &gt; C字符串</a></li><li><a href="#-algorithm--算法">&lt; algorithm &gt; 算法</a></li><li><a href="#-numeric--数值序列">&lt; numeric &gt; 数值序列</a></li><li><a href="#-utility--二元组">&lt; utility &gt; 二元组</a></li><li><a href="#-string--字符串">&lt; string &gt; 字符串</a></li><li><a href="#-bitset--01数组">&lt; bitset &gt; 01数组</a></li><li><a href="#-iterator--迭代器">&lt; iterator &gt; 迭代器</a></li><li><a href="#-vector--动态数组">&lt; vector &gt; 动态数组</a></li><li><a href="#-map--映射表">&lt; map &gt; 映射表</a></li><li><a href="#-set--集合">&lt; set &gt; 集合</a></li><li><a href="#-stack--栈">&lt; stack &gt; 栈</a></li><li><a href="#-queue-队列">&lt; queue&gt; 队列</a></li></ul></li></ul></li><li><a href="#python">Python</a><ul><li><a href="#输入">输入</a></li></ul></li><li><a href="#留坑">留坑</a></li></ul></li></ul><hr><h3 id="基础"><a href="#基础" class="headerlink" title="基础"></a>基础</h3><h4 id="通用模版"><a href="#通用模版" class="headerlink" title="通用模版"></a>通用模版</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> endl <span class="meta-string">"\n"</span> <span class="comment">//防止卡endl</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> rg register int <span class="comment">//循环变量专用</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"Ofast,no-stack-protector"</span>) <span class="comment">//神仙优化，比较假</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stack&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;map&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;ctime&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    freopen(<span class="string">"input.in"</span>, <span class="string">"r"</span>, <span class="built_in">stdin</span>);</span><br><span class="line">    freopen(<span class="string">"output.out"</span>, <span class="string">"w"</span>, <span class="built_in">stdout</span>);</span><br><span class="line">    </span><br><span class="line">    ios::sync_with_stdio(<span class="literal">false</span>); <span class="comment">//cin、cout不能与scanf、printf混用 </span></span><br><span class="line">    <span class="built_in">cin</span>.tie(<span class="number">0</span>); <span class="comment">//输入一定要在输出之前</span></span><br><span class="line">    <span class="built_in">cout</span>.tie(<span class="number">0</span>);</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"%.5lf"</span>, (<span class="keyword">double</span>)clock() / CLOCKS_PER_SEC);<span class="comment">//输出时间</span></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="性能测试"><a href="#性能测试" class="headerlink" title="性能测试"></a>性能测试</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//用已经AC了的题交这个代码，以测试评测机性能</span></span><br><span class="line"><span class="keyword">int</span> a;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">1000000000</span>; i++) a ^= i;</span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; a;</span><br></pre></td></tr></table></figure><hr><h4 id="玄学优化"><a href="#玄学优化" class="headerlink" title="玄学优化"></a>玄学优化</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize (<span class="meta-string">"O3"</span>) <span class="comment">//开O3</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC -mcmodle=large <span class="comment">//开巨型数组不RE(编译时间变长)</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 以下慎用</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(2)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(3)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"Ofast"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"inline"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fgcse"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fgcse-lm"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fipa-sra"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-ftree-pre"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-ftree-vrp"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fpeephole2"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-ffast-math"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fsched-spec"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"unroll-loops"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-falign-jumps"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-falign-loops"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-falign-labels"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fdevirtualize"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fcaller-saves"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fcrossjumping"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fthread-jumps"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-funroll-loops"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-freorder-blocks"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fschedule-insns"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"inline-functions"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-ftree-tail-merge"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fschedule-insns2"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fstrict-aliasing"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-falign-functions"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fcse-follow-jumps"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fsched-interblock"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fpartial-inlining"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"no-stack-protector"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-freorder-functions"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-findirect-inlining"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fhoist-adjacent-loads"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-frerun-cse-after-loop"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"inline-small-functions"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-finline-small-functions"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-ftree-switch-conversion"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-foptimize-sibling-calls"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fexpensive-optimizations"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"inline-functions-called-once"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> GCC optimize(<span class="meta-string">"-fdelete-null-pointer-checks"</span>)</span></span><br></pre></td></tr></table></figure><hr><h4 id="手动扩栈"><a href="#手动扩栈" class="headerlink" title="手动扩栈"></a>手动扩栈</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//C++使用，在开头写</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> comment(linker, <span class="meta-string">"/STACK:1024000000,1024000000"</span>)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//G++使用</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">extern</span> <span class="keyword">void</span> <span class="title">MAIN</span><span class="params">(<span class="keyword">void</span>)</span> __<span class="title">asm__</span><span class="params">(<span class="string">"MAIN"</span>)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">MAIN</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">//在这里写代码</span></span><br><span class="line">    <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> size = <span class="number">4096l</span>l &lt;&lt; <span class="number">20</span>; <span class="comment">// 4096 MB</span></span><br><span class="line">    <span class="keyword">char</span>* p = <span class="keyword">new</span> <span class="keyword">char</span>[size] + size;</span><br><span class="line">    __asm__ __volatile__(</span><br><span class="line">        <span class="string">"movq %0, %%rsp\n"</span></span><br><span class="line">        <span class="string">"pushq $exit\n"</span></span><br><span class="line">        <span class="string">"jmp MAIN\n"</span></span><br><span class="line">        ::<span class="string">"r"</span>(p));</span><br><span class="line">    MAIN();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="输入输出"><a href="#输入输出" class="headerlink" title="输入输出"></a>输入输出</h4><h5 id="特殊格式与转换"><a href="#特殊格式与转换" class="headerlink" title="特殊格式与转换"></a>特殊格式与转换</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">char</span> s[MAX];</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">" %[^\n]"</span>, s);    <span class="comment">//遇到回车结束（读一整行）</span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">" %[^#]"</span>, s);     <span class="comment">//遇到#结束     </span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">" %[^ ]"</span>, s);     <span class="comment">//遇到空格结束</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">char</span> str[<span class="number">20</span>];</span><br><span class="line"><span class="built_in">cin</span>.getline(name); <span class="comment">//读入一行</span></span><br><span class="line"><span class="built_in">cin</span>.getline(name, <span class="number">20</span>); <span class="comment">//读入一行，指定长度</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">string</span> s;</span><br><span class="line">getline(<span class="built_in">cin</span>, s); <span class="comment">//string的读入一行</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//读到文件尾</span></span><br><span class="line"><span class="keyword">while</span> (<span class="built_in">cin</span>) &#123;&#125;</span><br><span class="line"><span class="keyword">while</span>(~<span class="built_in">scanf</span>) &#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输出为二进制</span></span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; <span class="string">"x = "</span> &lt;&lt; <span class="built_in">bitset</span>&lt;32&gt;(x) &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 十进制转换十六进制</span></span><br><span class="line"><span class="built_in">stringstream</span> ss;</span><br><span class="line">ss &lt;&lt; hex &lt;&lt; stol(<span class="string">"123"</span>);</span><br><span class="line"><span class="built_in">string</span> hex_num = ss.str();</span><br></pre></td></tr></table></figure><hr><h5 id="精度控制"><a href="#精度控制" class="headerlink" title="精度控制"></a>精度控制</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//设置有效数字位数。</span></span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; setprecision(位数) &lt;&lt; number &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//设置小数精度(小数点后的有效位数)</span></span><br><span class="line"><span class="built_in">cout</span> &lt;&lt;setiosflags(ios::fixed);    </span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; setprecision(位数) &lt;&lt; number &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//设置小数精度(小数点后的有效位数)</span></span><br><span class="line"><span class="built_in">cout</span> &lt;&lt; fixed &lt;&lt; setprecision(<span class="number">10</span>) &lt;&lt; number &lt;&lt; <span class="built_in">endl</span>;</span><br></pre></td></tr></table></figure><hr><h5 id="挂"><a href="#挂" class="headerlink" title="挂"></a>挂</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 本机测试需要EOF才能看到输出结果</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 快速输入挂</span></span><br><span class="line"><span class="comment">// 读入1e7 大约0.4s</span></span><br><span class="line"><span class="keyword">namespace</span> fastinput</span><br><span class="line">&#123;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> BUF_SIZE 1048576</span></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">char</span> <span class="title">nc</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">static</span> <span class="keyword">char</span> buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;</span><br><span class="line">        <span class="keyword">if</span> (p1 == pend)</span><br><span class="line">        &#123;</span><br><span class="line">            p1 = buf;</span><br><span class="line">            pend = buf + fread(buf, <span class="number">1</span>, BUF_SIZE, <span class="built_in">stdin</span>);</span><br><span class="line">            assert(pend != p1);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> *p1++;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">bool</span> <span class="title">blank</span><span class="params">(<span class="keyword">char</span> c)</span> </span>&#123; <span class="keyword">return</span> c == <span class="string">' '</span> || c == <span class="string">'\n'</span> || c == <span class="string">'\r'</span> || c == <span class="string">'\t'</span>; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// non-negative integer</span></span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">int</span> <span class="title">get_unsigned_int</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> x = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">char</span> c = nc();</span><br><span class="line">        <span class="keyword">while</span> (blank(c)) c = nc();</span><br><span class="line">        <span class="keyword">for</span> (; c &gt;= <span class="string">'0'</span> &amp;&amp; c &lt;= <span class="string">'9'</span>; c = nc()) x = x * <span class="number">10</span> + c - <span class="string">'0'</span>;</span><br><span class="line">        <span class="keyword">return</span> x;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// integer</span></span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">int</span> <span class="title">get_int</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> x = <span class="number">0</span>, sgn = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">char</span> c = nc();</span><br><span class="line">        <span class="keyword">while</span> (blank(c)) c = nc();</span><br><span class="line">        <span class="keyword">if</span> (c == <span class="string">'-'</span>) sgn = <span class="number">-1</span>, c = nc();</span><br><span class="line">        <span class="keyword">for</span> (; c &gt;= <span class="string">'0'</span> &amp;&amp; c &lt;= <span class="string">'9'</span>; c = nc()) x = x * <span class="number">10</span> + c - <span class="string">'0'</span>;</span><br><span class="line">        <span class="keyword">return</span> sgn * x;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">undef</span> BUF_SIZE</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">//使用</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> fastinput;</span><br><span class="line"><span class="keyword">int</span> n = get_int();</span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">int</span> n = get_unsigned_int();</span><br><span class="line"></span><br><span class="line"><span class="comment">//输入输出挂</span></span><br><span class="line"><span class="keyword">namespace</span> fastIO</span><br><span class="line">&#123;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> BUF_SIZE 100000</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> OUT_SIZE 100000</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> ll long long</span></span><br><span class="line">    <span class="comment">//fread-&gt;read</span></span><br><span class="line">    <span class="keyword">bool</span> IOerror = <span class="number">0</span>;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">char</span> <span class="title">nc</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">static</span> <span class="keyword">char</span> buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;</span><br><span class="line">        <span class="keyword">if</span> (p1 == pend)</span><br><span class="line">        &#123;</span><br><span class="line">            p1 = buf; pend = buf + fread(buf, <span class="number">1</span>, BUF_SIZE, <span class="built_in">stdin</span>);</span><br><span class="line">            <span class="keyword">if</span> (pend == p1) &#123; IOerror = <span class="number">1</span>; <span class="keyword">return</span> <span class="number">-1</span>; &#125;</span><br><span class="line">            <span class="comment">//&#123;printf("IO error!\n"); system("pause"); for (;;); exit(0);&#125;</span></span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> *p1++;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">bool</span> <span class="title">blank</span><span class="params">(<span class="keyword">char</span> ch)</span> </span>&#123; <span class="keyword">return</span> ch == <span class="string">' '</span> || ch == <span class="string">'\n'</span> || ch == <span class="string">'\r'</span> || ch == <span class="string">'\t'</span>; &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">read</span><span class="params">(<span class="keyword">int</span> &amp;x)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">bool</span> sign = <span class="number">0</span>; <span class="keyword">char</span> ch = nc(); x = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (; blank(ch); ch = nc());</span><br><span class="line">        <span class="keyword">if</span> (IOerror) <span class="keyword">return</span>;</span><br><span class="line">        <span class="keyword">if</span> (ch == <span class="string">'-'</span>) sign = <span class="number">1</span>, ch = nc();</span><br><span class="line">        <span class="keyword">for</span> (; ch &gt;= <span class="string">'0'</span>&amp;&amp;ch &lt;= <span class="string">'9'</span>; ch = nc()) x = x * <span class="number">10</span> + ch - <span class="string">'0'</span>;</span><br><span class="line">        <span class="keyword">if</span> (sign) x = -x;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">read</span><span class="params">(ll &amp;x)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">bool</span> sign = <span class="number">0</span>; <span class="keyword">char</span> ch = nc(); x = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (; blank(ch); ch = nc());</span><br><span class="line">        <span class="keyword">if</span> (IOerror) <span class="keyword">return</span>;</span><br><span class="line">        <span class="keyword">if</span> (ch == <span class="string">'-'</span>) sign = <span class="number">1</span>, ch = nc();</span><br><span class="line">        <span class="keyword">for</span> (; ch &gt;= <span class="string">'0'</span>&amp;&amp;ch &lt;= <span class="string">'9'</span>; ch = nc()) x = x * <span class="number">10</span> + ch - <span class="string">'0'</span>;</span><br><span class="line">        <span class="keyword">if</span> (sign) x = -x;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">read</span><span class="params">(<span class="keyword">double</span> &amp;x)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">bool</span> sign = <span class="number">0</span>; <span class="keyword">char</span> ch = nc(); x = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (; blank(ch); ch = nc());</span><br><span class="line">        <span class="keyword">if</span> (IOerror) <span class="keyword">return</span>;</span><br><span class="line">        <span class="keyword">if</span> (ch == <span class="string">'-'</span>) sign = <span class="number">1</span>, ch = nc();</span><br><span class="line">        <span class="keyword">for</span> (; ch &gt;= <span class="string">'0'</span>&amp;&amp;ch &lt;= <span class="string">'9'</span>; ch = nc()) x = x * <span class="number">10</span> + ch - <span class="string">'0'</span>;</span><br><span class="line">        <span class="keyword">if</span> (ch == <span class="string">'.'</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">double</span> tmp = <span class="number">1</span>; ch = nc();</span><br><span class="line">            <span class="keyword">for</span> (; ch &gt;= <span class="string">'0'</span>&amp;&amp;ch &lt;= <span class="string">'9'</span>; ch = nc())tmp /= <span class="number">10.0</span>, x += tmp * (ch - <span class="string">'0'</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (sign) x = -x;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">read</span><span class="params">(<span class="keyword">char</span> *s)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">char</span> ch = nc();</span><br><span class="line">        <span class="keyword">for</span> (; blank(ch); ch = nc());</span><br><span class="line">        <span class="keyword">if</span> (IOerror) <span class="keyword">return</span>;</span><br><span class="line">        <span class="keyword">for</span> (; !blank(ch) &amp;&amp; !IOerror; ch = nc()) *s++ = ch;</span><br><span class="line">        *s = <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">read</span><span class="params">(<span class="keyword">char</span> &amp;c)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">for</span> (c = nc(); blank(c); c = nc());</span><br><span class="line">        <span class="keyword">if</span> (IOerror) &#123; c = <span class="number">-1</span>; <span class="keyword">return</span>; &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">//fwrite-&gt;write</span></span><br><span class="line">    <span class="class"><span class="keyword">struct</span> <span class="title">Ostream_fwrite</span></span></span><br><span class="line"><span class="class">    &#123;</span></span><br><span class="line">        <span class="keyword">char</span> *buf, *p1, *pend;</span><br><span class="line">        Ostream_fwrite() &#123; buf = <span class="keyword">new</span> <span class="keyword">char</span>[BUF_SIZE]; p1 = buf; pend = buf + BUF_SIZE; &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">out</span><span class="params">(<span class="keyword">char</span> ch)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">            <span class="keyword">if</span> (p1 == pend) &#123; fwrite(buf, <span class="number">1</span>, BUF_SIZE, <span class="built_in">stdout</span>); p1 = buf; &#125;</span><br><span class="line">            *p1++ = ch;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">print</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">            <span class="keyword">static</span> <span class="keyword">char</span> s[<span class="number">15</span>], *s1; s1 = s;</span><br><span class="line">            <span class="keyword">if</span> (!x) *s1++ = <span class="string">'0'</span>; <span class="keyword">if</span> (x &lt; <span class="number">0</span>) out(<span class="string">'-'</span>), x = -x;</span><br><span class="line">            <span class="keyword">while</span> (x) *s1++ = x % <span class="number">10</span> + <span class="string">'0'</span>, x /= <span class="number">10</span>;</span><br><span class="line">            <span class="keyword">while</span> (s1-- != s) out(*s1);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">println</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">            <span class="keyword">static</span> <span class="keyword">char</span> s[<span class="number">15</span>], *s1; s1 = s;</span><br><span class="line">            <span class="keyword">if</span> (!x) *s1++ = <span class="string">'0'</span>; <span class="keyword">if</span> (x &lt; <span class="number">0</span>) out(<span class="string">'-'</span>), x = -x;</span><br><span class="line">            <span class="keyword">while</span> (x) *s1++ = x % <span class="number">10</span> + <span class="string">'0'</span>, x /= <span class="number">10</span>;</span><br><span class="line">            <span class="keyword">while</span> (s1-- != s) out(*s1); out(<span class="string">'\n'</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">print</span><span class="params">(ll x)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">            <span class="keyword">static</span> <span class="keyword">char</span> s[<span class="number">25</span>], *s1; s1 = s;</span><br><span class="line">            <span class="keyword">if</span> (!x) *s1++ = <span class="string">'0'</span>; <span class="keyword">if</span> (x &lt; <span class="number">0</span>) out(<span class="string">'-'</span>), x = -x;</span><br><span class="line">            <span class="keyword">while</span> (x) *s1++ = x % <span class="number">10</span> + <span class="string">'0'</span>, x /= <span class="number">10</span>;</span><br><span class="line">            <span class="keyword">while</span> (s1-- != s) out(*s1);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">println</span><span class="params">(ll x)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">            <span class="keyword">static</span> <span class="keyword">char</span> s[<span class="number">25</span>], *s1; s1 = s;</span><br><span class="line">            <span class="keyword">if</span> (!x) *s1++ = <span class="string">'0'</span>; <span class="keyword">if</span> (x &lt; <span class="number">0</span>) out(<span class="string">'-'</span>), x = -x;</span><br><span class="line">            <span class="keyword">while</span> (x) *s1++ = x % <span class="number">10</span> + <span class="string">'0'</span>, x /= <span class="number">10</span>;</span><br><span class="line">            <span class="keyword">while</span> (s1-- != s) out(*s1); out(<span class="string">'\n'</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">print</span><span class="params">(<span class="keyword">double</span> x, <span class="keyword">int</span> y)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">            <span class="keyword">static</span> ll mul[] = &#123; <span class="number">1</span>,<span class="number">10</span>,<span class="number">100</span>,<span class="number">1000</span>,<span class="number">10000</span>,<span class="number">100000</span>,<span class="number">1000000</span>,<span class="number">10000000</span>,<span class="number">100000000</span>, <span class="number">1000000000</span>,<span class="number">10000000000L</span>L,<span class="number">100000000000L</span>L,<span class="number">1000000000000L</span>L,<span class="number">10000000000000L</span>L, <span class="number">100000000000000L</span>L,<span class="number">1000000000000000L</span>L,<span class="number">10000000000000000L</span>L,<span class="number">100000000000000000L</span>L &#125;;</span><br><span class="line">            <span class="keyword">if</span> (x &lt; <span class="number">-1e-12</span>) out(<span class="string">'-'</span>), x = -x; x *= mul[y];</span><br><span class="line">            ll x1 = (ll)<span class="built_in">floor</span>(x); <span class="keyword">if</span> (x - <span class="built_in">floor</span>(x) &gt;= <span class="number">0.5</span>) ++x1;</span><br><span class="line">            ll x2 = x1 / mul[y], x3 = x1 - x2 * mul[y]; print(x2);</span><br><span class="line">            <span class="keyword">if</span> (y &gt; <span class="number">0</span>) &#123; out(<span class="string">'.'</span>); <span class="keyword">for</span> (<span class="keyword">size_t</span> i = <span class="number">1</span>; i &lt; y&amp;&amp;x3*mul[i] &lt; mul[y]; out(<span class="string">'0'</span>), ++i); print(x3); &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">println</span><span class="params">(<span class="keyword">double</span> x, <span class="keyword">int</span> y)</span> </span>&#123; print(x, y); out(<span class="string">'\n'</span>); &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">print</span><span class="params">(<span class="keyword">char</span> *s)</span> </span>&#123; <span class="keyword">while</span> (*s) out(*s++); &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">println</span><span class="params">(<span class="keyword">char</span> *s)</span> </span>&#123; <span class="keyword">while</span> (*s) out(*s++); out(<span class="string">'\n'</span>); &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">flush</span><span class="params">()</span> </span>&#123; <span class="keyword">if</span> (p1 != buf) &#123; fwrite(buf, <span class="number">1</span>, p1 - buf, <span class="built_in">stdout</span>); p1 = buf; &#125; &#125;</span><br><span class="line">        ~Ostream_fwrite() &#123; flush(); &#125;</span><br><span class="line">    &#125; Ostream;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">print</span><span class="params">(<span class="keyword">int</span> x)</span> </span>&#123; Ostream.print(x); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">println</span><span class="params">(<span class="keyword">int</span> x)</span> </span>&#123; Ostream.println(x); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">print</span><span class="params">(<span class="keyword">char</span> x)</span> </span>&#123; Ostream.out(x); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">println</span><span class="params">(<span class="keyword">char</span> x)</span> </span>&#123; Ostream.out(x); Ostream.out(<span class="string">'\n'</span>); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">print</span><span class="params">(ll x)</span> </span>&#123; Ostream.print(x); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">println</span><span class="params">(ll x)</span> </span>&#123; Ostream.println(x); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">print</span><span class="params">(<span class="keyword">double</span> x, <span class="keyword">int</span> y)</span> </span>&#123; Ostream.print(x, y); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">println</span><span class="params">(<span class="keyword">double</span> x, <span class="keyword">int</span> y)</span> </span>&#123; Ostream.println(x, y); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">print</span><span class="params">(<span class="keyword">char</span> *s)</span> </span>&#123; Ostream.print(s); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">println</span><span class="params">(<span class="keyword">char</span> *s)</span> </span>&#123; Ostream.println(s); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">println</span><span class="params">()</span> </span>&#123; Ostream.out(<span class="string">'\n'</span>); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">flush</span><span class="params">()</span> </span>&#123; Ostream.flush(); &#125;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">undef</span> ll</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">undef</span> OUT_SIZE</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">undef</span> BUF_SIZE</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">//使用</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> fastIO;</span><br><span class="line"><span class="keyword">int</span> n;</span><br><span class="line">read(n);</span><br><span class="line">print(n);</span><br><span class="line">println(n);</span><br></pre></td></tr></table></figure><hr><h4 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h4><h5 id="ASCII表"><a href="#ASCII表" class="headerlink" title="ASCII表"></a>ASCII表</h5><p><a href="https://cdn.luogu.org/upload/pic/28671.png" target="_blank" rel="noopener">这里</a></p><p><img src="https://cdn.luogu.org/upload/pic/28671.png" alt="ASCII表"></p><hr><h5 id="常用数表"><a href="#常用数表" class="headerlink" title="常用数表"></a>常用数表</h5><table><thead><tr><th>类型</th><th>数据</th></tr></thead><tbody><tr><td>char</td><td>-128 ~ 127</td></tr><tr><td>short</td><td>-32768 ~ 32767</td></tr><tr><td>int</td><td>-2147483648 ~ 2147483647(±2e9)</td></tr><tr><td>unsigned int</td><td>-0 ~ 4294967295(4e9)</td></tr><tr><td>long long</td><td>-9223372036854775808 ~ 9223372036854775807(±9e18)</td></tr><tr><td>unsigned long long</td><td>0 ~ 18446744073709551615(1e19)</td></tr><tr><td>double</td><td>± (1.7e-308 ~ 1.7e308)</td></tr><tr><td>long double</td><td>± (1.2e-4932 ~ 1.2e4932)</td></tr><tr><td>INF = 0x3f3f3f3f</td><td>1061109567</td></tr><tr><td>LINF = 0x3f3f3f3f3f3f3f3f</td><td>4557430888798830399</td></tr></tbody></table><hr><h5 id="时间复杂度与数据规模"><a href="#时间复杂度与数据规模" class="headerlink" title="时间复杂度与数据规模"></a>时间复杂度与数据规模</h5><p>评测机每秒约 $10^8$ 至 $1.5 \times 10^9$</p><p>1MB内存约 $2.5 \times 10^5$ 也就是 25万 个int（4个字节）</p><hr><h3 id="数学"><a href="#数学" class="headerlink" title="数学"></a>数学</h3><h4 id="常用网站"><a href="#常用网站" class="headerlink" title="常用网站"></a>常用网站</h4><ul><li><a href="http://oeis.org/" target="_blank" rel="noopener">OEIS</a></li><li><a href="https://zh.numberempire.com/" target="_blank" rel="noopener">数字帝国</a></li><li><a href="http://www.wolframalpha.com/" target="_blank" rel="noopener">WolframAlpha</a></li></ul><hr><h4 id="数学理论"><a href="#数学理论" class="headerlink" title="数学理论"></a>数学理论</h4><h5 id="负数求余"><a href="#负数求余" class="headerlink" title="负数求余"></a>负数求余</h5><p>负数的求余数仍为负数，有正负时使用<code>if (abs(x%2))</code>或者<code>if (x&amp;1)</code>判断是否为奇数</p><hr><h5 id="组合数"><a href="#组合数" class="headerlink" title="组合数"></a>组合数</h5><p>通项公式:</p><p>$$<br>C_{m}^{n}=\frac{m !}{n ! *(m-n) !}<br>$$</p><p>递推公式:</p><p>$$<br>C_{m}^{n}=C_{m-1}^{n}+C_{m-1}^{n-1}<br>$$</p><p>性质:</p><p>$$<br>C_{m+r+1}^{r}=\sum_{i=0}^{r} C_{m+i}^{i}<br>$$</p><p>$$<br>C_{m}^{n} * C_{n}^{r}=C_{m}^{r} * C_{m-r}^{n-r}<br>$$</p><p>$$<br>\sum_{i=0}^{m} C_{m}^{i} * x^{i}=(x+1)^{m}<br>$$</p><p>$$<br>C_{m}^{0}-C_{m}^{1}+C_{m}^{2}-\ldots \pm C_{m}^{m}=0<br>$$</p><p>$$<br>C_{m}^{0}+C_{m}^{2}+C_{m}^{4} \ldots=C_{m}^{1}+C_{m}^{3}+C_{m}^{5}+\ldots=2^{m-1}<br>$$</p><p>$$<br>C_{m+n}^{r}=C_{m}^{0} * C_{n}^{r}+C_{m}^{1} * C_{n}^{r-1}+\ldots+C_{m}^{r} * C_{n}^{0}<br>$$</p><p>$$<br>C_{m+n}^{n}=C_{m}^{0} * C_{n}^{0}+C_{m}^{1} * C_{n}^{1}+\ldots+C_{m}^{m} * C_{n}^{m}<br>$$</p><p>$$<br>n * C_{m}^{n}=m * C_{m-1}^{n-1}<br>$$</p><p>$$<br>\sum_{i=1}^{n} C_{n}^{i} * i=n * 2^{n-1}<br>$$</p><p>$$<br>\sum_{i=1}^{n} C_{n}^{i} * i^{2}=n *(n+1) * 2^{n-2}<br>$$</p><p>$$<br>\sum_{i=0}^{n}\left(C_{n}^{i}\right)^{2}=C_{2 n}^{n}<br>$$</p><p>奇偶性: 对于 $C_{n}^{k}$ ，若 <code>n &amp; k = k</code> 则 $C_{n}^{k}$ 为奇数，否则为偶数。</p><hr><h5 id="错位排列数"><a href="#错位排列数" class="headerlink" title="错位排列数"></a>错位排列数</h5><p>将数字1~n排成一列，且数字i不在第i位的方案数:</p><p>$$<br>D_1=0\ ,\ D_2=1<br>$$</p><p>$$<br>D_n=(n-1)(D_{n-1}+D_{n-2})<br>$$</p><hr><h5 id="威尔逊定理"><a href="#威尔逊定理" class="headerlink" title="威尔逊定理"></a>威尔逊定理</h5><p>当且仅当p为质数时，有</p><p>$$<br>(p-1) ! \equiv -1 \mod{p}<br>$$</p><p>$$<br>(p-1) ! \equiv p-1 \mod{p}<br>$$</p><hr><h5 id="费马小定理"><a href="#费马小定理" class="headerlink" title="费马小定理"></a>费马小定理</h5><p>若p是质数，则对于任意整数a，有</p><p>$$<br>a^{p-1}\equiv 1 \mod{p}<br>$$</p><p>$$<br>a^{p}\equiv a \mod{p}<br>$$</p><hr><h5 id="费马大定理"><a href="#费马大定理" class="headerlink" title="费马大定理"></a>费马大定理</h5><p>当整数 $n&gt;2$ 时，方程</p><p>$$<br>x^n+y^n=z^n<br>$$</p><p>无正整数解</p><hr><h5 id="哥德巴赫猜想"><a href="#哥德巴赫猜想" class="headerlink" title="哥德巴赫猜想"></a>哥德巴赫猜想</h5><p>任一大于2的偶数都可写成两个素数之和</p><p>任一大于5的奇数都可写成三个素数之和</p><hr><h5 id="勾股数"><a href="#勾股数" class="headerlink" title="勾股数"></a>勾股数</h5><p>$$<br>a^2+b^2=c^2<br>$$</p><p>当 $n&gt;1$ 时:</p><p>$$<br>a=2n+1,b=2n^2+2n,c=2n^2+2n+1<br>$$</p><p>$$<br>a=2n,b=n^2-1,c=n^2+1<br>$$</p><p>$$<br>a=4n,b=4n^2-1,c=4n^2+1\ (a,b,c 互质)<br>$$</p><hr><h5 id="抽屉原理"><a href="#抽屉原理" class="headerlink" title="抽屉原理"></a>抽屉原理</h5><p>原理一：把n+1个咕咕咕放到n个巢里，那么至少有两个咕咕咕在同一个巢里</p><p>原理二：把m*n-1个物体放入n个抽屉中，其中必定有一个抽屉中最多有m-1个物体 (例如：将3×5-1=14个物体放入5个抽屉中，则必定有一个抽屉中的物体数少于等于3-1=2)</p><hr><h5 id="欧拉公式"><a href="#欧拉公式" class="headerlink" title="欧拉公式"></a>欧拉公式</h5><p>对于简单多面体（或者投射），点-边+面=2</p><p>$$<br>V-E+F=2<br>$$</p><hr><h4 id="欧几里德算法"><a href="#欧几里德算法" class="headerlink" title="欧几里德算法"></a>欧几里德算法</h4><h5 id="最大公约数-GCD"><a href="#最大公约数-GCD" class="headerlink" title="最大公约数 GCD"></a>最大公约数 GCD</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//欧几里德算法 gcd(a,b) == gcd(b,a%b)</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">gcd</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123; <span class="keyword">return</span> y ? gcd(y, x%y) : x; &#125;</span><br></pre></td></tr></table></figure><hr><h5 id="扩展欧几里德算法-EXGCD"><a href="#扩展欧几里德算法-EXGCD" class="headerlink" title="扩展欧几里德算法 EXGCD"></a>扩展欧几里德算法 EXGCD</h5><blockquote><p>裴蜀等式</p></blockquote><p>对任意两个整数a和b，关于未知数x和y的线性丢番图方程（裴蜀等式）：</p><p>$$<br>ax+by=m<br>$$</p><p>当且仅当m是gcd(a,b)的倍数时有整数解(x,y)。裴蜀等式有解时必然有无穷多个解。</p><p>推论：a,b互质时使得 $ax+by=1$ 有解（充要条件）</p><blockquote><p>扩展欧几里德算法</p></blockquote><p>用于求裴蜀等式的特解 $(x_0,y_0)$ ，即 $ax+by=gcd(a,b)$ 的解(绝对值之和最小的解)。</p><p>原式 $ax+by=m$ 的通解 k∈z</p><p>$$<br>x=\frac{m}{gcd(a,b)}x_0+k\frac{b}{gcd(a,b)}<br>$$</p><p>$$<br>y=\frac{m}{gcd(a,b)}y_0-k\frac{a}{gcd(a,b)}<br>$$</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//x,y为引用，返回值为gcd(a,b)</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">exgcd</span><span class="params">(<span class="keyword">int</span> a, <span class="keyword">int</span> b, <span class="keyword">int</span> &amp;x, <span class="keyword">int</span> &amp;y)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (b == <span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        x = <span class="number">1</span>;</span><br><span class="line">        y = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">return</span> a;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">int</span> r = exgcd(b, a%b, x, y);</span><br><span class="line">    <span class="keyword">int</span> t = y;</span><br><span class="line">    y = x - (a / b) * y;</span><br><span class="line">    x = t;</span><br><span class="line">    <span class="keyword">return</span> r;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="欧拉"><a href="#欧拉" class="headerlink" title="欧拉"></a>欧拉</h4><h5 id="欧拉函数"><a href="#欧拉函数" class="headerlink" title="欧拉函数"></a>欧拉函数</h5><h6 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h6><p>对于一个正整数x，小于x且和x互质的正整数（包括1）的个数，记作 $φ(x)$</p><p>$$<br>φ(x)=x\prod_{i=1}^{n}(1-\frac{1}{p_i})<br>$$</p><hr><h6 id="性质"><a href="#性质" class="headerlink" title="性质"></a>性质</h6><p>对于质数p， $φ(p)=p-1$ ，且 $φ(1)=1$</p><p>对于质数p，有 $n=p^k$ ，则 $φ(n)=p^k-p^{k-1}=(p-1)p^{k-1}$</p><p>对于奇数p， $φ(2p)=φ(p)$</p><p>对于一个正整数n，与其互质的数之和为 $φ(n)*n/2$</p><p>对于一个正整数n，对于所有n的正整数因子d (即 $d|n$ )，即 $\sum_{d|n} φ(d)=n$</p><p>对于一个正整数n，且a为n的质因数，则：</p><p>若 $n|a$ 且 $(n/a)|a$ ，则 $φ(n)=φ(n/a)*a$</p><p>若 $n|a$ 且 $(n/a) \nmid a$，则 $φ(n)=φ(n/a)*(a-1)$</p><p>积性函数：若m,n互质(即 $gcd(m,n)=1$ )，则 $φ(mn)=φ(m)φ(n)=(m-1)(n-1)$</p><hr><h6 id="求法"><a href="#求法" class="headerlink" title="求法"></a>求法</h6><blockquote><p>直接求</p></blockquote><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//O(sqrt())</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">phi</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> res = x, a = x;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i*i &lt;= a; i++)</span><br><span class="line">        <span class="keyword">if</span> (a%i == <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            res = res / i * (i - <span class="number">1</span>);</span><br><span class="line">            <span class="keyword">while</span> (a%i == <span class="number">0</span>) a /= i;</span><br><span class="line">        &#125;</span><br><span class="line">    <span class="keyword">if</span> (a &gt; <span class="number">1</span>) res = res / a * (a - <span class="number">1</span>);</span><br><span class="line">    <span class="keyword">return</span> res;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><blockquote><p>线性筛法</p></blockquote><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//较快，O(n)</span></span><br><span class="line"><span class="comment">//更快的请参考杜教筛</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">int</span> MAXN = <span class="number">50000</span> + <span class="number">100</span>;</span><br><span class="line"><span class="keyword">bool</span> check[MAXN];</span><br><span class="line"><span class="keyword">int</span> phi[MAXN] = &#123; <span class="number">0</span> &#125;, prime[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">get_phi</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">memset</span>(check, <span class="literal">false</span>, <span class="keyword">sizeof</span>(check));</span><br><span class="line">    <span class="keyword">int</span> tot = <span class="number">0</span>;</span><br><span class="line">    phi[<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i &lt;= MAXN - <span class="number">100</span>; ++i)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!check[i])</span><br><span class="line">        &#123;</span><br><span class="line">            prime[tot++] = i;</span><br><span class="line">            phi[i] = i - <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; tot; ++j)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (i * prime[j] &gt; MAXN - <span class="number">100</span>) <span class="keyword">break</span>;</span><br><span class="line">            check[i * prime[j]] = <span class="literal">true</span>;</span><br><span class="line">            <span class="keyword">if</span> (i % prime[j] == <span class="number">0</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                phi[i * prime[j]] = phi[i] * prime[j];</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span> phi[i * prime[j]] = phi[i] * (prime[j] - <span class="number">1</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><blockquote><p>递推法</p></blockquote><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//较慢</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">int</span> MAXN = <span class="number">50000</span> + <span class="number">100</span>;</span><br><span class="line"><span class="keyword">int</span> phi[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">get_phi</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    phi[<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i &lt;= MAXN - <span class="number">100</span>; i++)</span><br><span class="line">        <span class="keyword">if</span> (!phi[i])</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = i; j &lt;= MAXN - <span class="number">100</span>; j += i)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (!phi[j]) phi[j] = j;</span><br><span class="line">                phi[j] = phi[j] / i * (i - <span class="number">1</span>);</span><br><span class="line">            &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h5 id="欧拉定理"><a href="#欧拉定理" class="headerlink" title="欧拉定理"></a>欧拉定理</h5><p>若正整数a, n互质($gcd(a,p)=1$)，则</p><p>$$<br>a^{φ(n)}\equiv1\pmod{n}<br>$$</p><hr><h5 id="欧拉降幂"><a href="#欧拉降幂" class="headerlink" title="欧拉降幂"></a>欧拉降幂</h5><p>对于 $x\geqφ(p)$，有</p><p>$$<br>a^x \equiv a^{(x \ mod \ φ(p))+φ(p)}\pmod{p}<br>$$</p><p>对于 $x&lt;φ(p)$ ，无需降幂。</p><hr><h5 id="欧拉路径"><a href="#欧拉路径" class="headerlink" title="欧拉路径"></a>欧拉路径</h5><h6 id="欧拉回路"><a href="#欧拉回路" class="headerlink" title="欧拉回路"></a>欧拉回路</h6><p>每条边只经过一次，且回到起点</p><ul><li>无向图：连通（不考虑度为0的点），每个顶点度数都为偶数</li><li>有向图：基图连通（把边当成无向边，同样不考虑度为0的点），每个顶点的出度等于入度</li><li>混合图：<ul><li>既有无向边也有向边，首先是基图连通（不考虑度为0的点），然后需要借助网络流判定。</li><li>首先给原图中的每条无向边随便指定一个方向（称为初始定向），将原图改为有向图G’，然后的任务就是改变G’中某些条边的方向（当然是无向边转化来的，原来混合图中的有向边不能动）使其满足每个点的入度等于出度。</li><li>设D[i]为G’中（点i的出度-点i的入度），即可发现，在改变G’中边的方向的过程中，任何点的D值的奇偶性都不会发生改变（设将边&lt;i, j&gt;改为&lt;j, i&gt;，则i入度加1出度减1，j入度减1出度加1，两者之差加2或者减2，奇偶性不变），而最终要求的是每个点的入度等于出度，即每个点的D值都为0，是偶数，可得：若初始定向得到的G’中任⼀个点D值是奇数，那么原图中一定不存在欧拉环。</li><li>若初始D值都是偶数，则将G’改装成网络：设源点S和汇点T，对于每个D[i] &gt; 0的点i，连边&lt;S, i&gt;，容量为D[i]/2；对于每个D[j] &lt; 0的点j，连边&lt;j, T&gt;，容量为-D[j]/2；G’中的每条边在网中仍保留，容量为i（表示该边最多只能被改变一次方向）。求这个网络的最大流，若S引出的所有边均满流，则原混合图是欧拉图，将网络中所有流量为1的中间边（就是不与S或T关联的边）在G’中改变方向，形成的新图G”一定是有向欧拉图；若S引出的边中有的没有满流，则原混合图不是欧拉图。</li></ul></li></ul><hr><h6 id="欧拉路径-1"><a href="#欧拉路径-1" class="headerlink" title="欧拉路径"></a>欧拉路径</h6><p>每条边只经过一次，不要求回到起点。</p><ul><li>无向图：连通（不考虑度为0的点），每个顶点度数都为偶数或者仅有两个点的度数为奇数。</li><li>有向图：基图连通（把边当成无向边，同样不考虑度为0的点），每个顶点出度等于入度或者有且仅有一个点的出度比入度多1，有且仅有一个点的出度比入度少1，其余的出度等于入度。</li><li>混合图：如果存在欧拉回路，一定存在欧拉路径，否则如果有且仅有两个点的（出度-入度）是奇数，那么给这两个点加边，判断是否存在欧拉回路，如果存在就一定存在欧拉路径。</li></ul><hr><h4 id="杜教筛"><a href="#杜教筛" class="headerlink" title="杜教筛"></a>杜教筛</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//积性函数，欧拉函数和莫比乌斯函数</span></span><br><span class="line"><span class="comment">//复杂度O(n^2/3)~O(n^3/4)</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> MAXN = <span class="number">2000100</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> prime[MAXN];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> mu[MAXN];</span><br><span class="line"><span class="built_in">map</span>&lt;<span class="keyword">int</span>, <span class="keyword">long</span> <span class="keyword">long</span>&gt; ans_mu;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">init</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    fill(prime, prime + MAXN, <span class="number">1</span>);</span><br><span class="line">    mu[<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">int</span> tot = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i &lt; MAXN; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (prime[i])</span><br><span class="line">        &#123;</span><br><span class="line">            prime[++tot] = i;</span><br><span class="line">            mu[i] = <span class="number">-1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j &lt;= tot &amp;&amp; i * prime[j] &lt; MAXN; j++)</span><br><span class="line">        &#123;</span><br><span class="line">            prime[i * prime[j]] = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">if</span> (i % prime[j] == <span class="number">0</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                mu[i * prime[j]] = <span class="number">0</span>;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span> mu[i * prime[j]] = -mu[i];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i &lt; MAXN; i++) mu[i] += mu[i - <span class="number">1</span>];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">calc_mu</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (x &lt; MAXN) <span class="keyword">return</span> mu[x];</span><br><span class="line">    <span class="keyword">if</span> (ans_mu.count(x)) <span class="keyword">return</span> ans_mu[x];</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> i = <span class="number">2</span>, j; i &lt;= x; i = j + <span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        j = x / (x / i);</span><br><span class="line">        ans -= (j - i + <span class="number">1</span>) * calc_mu(x / i);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans_mu[x] = ans;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">calc_phi</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> i = <span class="number">1</span>, j; i &lt;= x; i = j + <span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        j = x / (x / i);</span><br><span class="line">        ans += (x / i) * (x / i) * (calc_mu(j) - calc_mu(i - <span class="number">1</span>));</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ((ans - <span class="number">1</span>) &gt;&gt; <span class="number">1</span>) + <span class="number">1</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="扩展大步小步-Baby-Steps-Giant-Steps"><a href="#扩展大步小步-Baby-Steps-Giant-Steps" class="headerlink" title="扩展大步小步 Baby Steps Giant Steps"></a>扩展大步小步 Baby Steps Giant Steps</h4><p>用于求解高次同余方程，即求解x：</p><p>$$<br>a^{x} \equiv b \mod{m}<br>$$ </p><p>普通版要求m为质数（或者a与m互质），如果x有解，则 $0 \leq x \lt m$；扩展版无要求</p><p>下列代码数据范围 $0 \leq a, b \leq m \leq 10^9 $</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//北上广深算法</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> MOD = <span class="number">1313131</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> MAXN = <span class="number">500000</span> + <span class="number">5</span>; <span class="comment">// sqrt(p)</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">gcd</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x, <span class="keyword">long</span> <span class="keyword">long</span> y)</span> </span>&#123; <span class="keyword">return</span> y ? gcd(y, x%y) : x; &#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Exgcd</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> a, <span class="keyword">long</span> <span class="keyword">long</span> b, <span class="keyword">long</span> <span class="keyword">long</span> &amp;d, <span class="keyword">long</span> <span class="keyword">long</span> &amp;x, <span class="keyword">long</span> <span class="keyword">long</span> &amp;y)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (!b)</span><br><span class="line">    &#123;</span><br><span class="line">        d = a;</span><br><span class="line">        x = <span class="number">1</span>;</span><br><span class="line">        y = <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        Exgcd(b, a % b, d, y, x);</span><br><span class="line">        y -= x * (a / b);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">qkpow</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> a, <span class="keyword">long</span> <span class="keyword">long</span> b, <span class="keyword">long</span> <span class="keyword">long</span> m)</span><span class="comment">//O(logN) a^b%m</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">1</span>;</span><br><span class="line">    a %= m;</span><br><span class="line">    <span class="keyword">while</span> (b)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (b &amp; <span class="number">1</span>) ans = (ans*a) % m;</span><br><span class="line">        a = (a*a) % m;</span><br><span class="line">        b &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans % m;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Hashset</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> head[MOD], Next[MAXN], f[MAXN], v[MAXN], ind;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        ind = <span class="number">0</span>;</span><br><span class="line">        <span class="built_in">memset</span>(head, <span class="number">-1</span>, <span class="keyword">sizeof</span> head);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">Insert</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x, <span class="keyword">long</span> <span class="keyword">long</span> _v)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> ins = x % MOD;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> j = head[ins]; j != <span class="number">-1</span>; j = Next[j])</span><br><span class="line">            <span class="keyword">if</span> (f[j] == x)</span><br><span class="line">            &#123;</span><br><span class="line">                v[j] = min(v[j], _v);</span><br><span class="line">                <span class="keyword">return</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        f[ind] = x, v[ind] = _v;</span><br><span class="line">        Next[ind] = head[ins], head[ins] = ind++;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> <span class="keyword">operator</span> [] (<span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> &amp;x) <span class="keyword">const</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> ins = x % MOD;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> j = head[ins]; j != <span class="number">-1</span>; j = Next[j])</span><br><span class="line">            <span class="keyword">if</span> (f[j] == x) <span class="keyword">return</span> v[j];</span><br><span class="line">        <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125; S;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">Solve</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> a, <span class="keyword">long</span> <span class="keyword">long</span> b, <span class="keyword">long</span> <span class="keyword">long</span> c)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> d, x, y;</span><br><span class="line">    Exgcd(a, c, d, x, y);</span><br><span class="line">    x = (x + c) % c;</span><br><span class="line">    <span class="keyword">return</span> x * b % c;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">BSGS</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> C, <span class="keyword">long</span> <span class="keyword">long</span> A, <span class="keyword">long</span> <span class="keyword">long</span> B, <span class="keyword">long</span> <span class="keyword">long</span> p)</span>  <span class="comment">// A^x%p=B S.T.(A,p)=1</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (p &lt;= <span class="number">100</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> d = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; p; ++i)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (d == B) <span class="keyword">return</span> i;</span><br><span class="line">            d = d * A % p;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> m = (<span class="keyword">int</span>)<span class="built_in">sqrt</span>(p);</span><br><span class="line">        S.reset();</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> d = <span class="number">1</span>, Search;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; m; ++i)</span><br><span class="line">        &#123;</span><br><span class="line">            S.Insert(d, i);</span><br><span class="line">            d = d * A % p;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i * m &lt; p; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            d = qkpow(A, i * m, p) * C % p;</span><br><span class="line">            Search = S[Solve(d, B, p)];</span><br><span class="line">            <span class="keyword">if</span> (Search != <span class="number">-1</span>) <span class="keyword">return</span> i * m + Search;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> a, b, m;</span><br><span class="line">    <span class="keyword">int</span> T;</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; T;</span><br><span class="line">    <span class="keyword">while</span> (T--)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">cin</span> &gt;&gt; a &gt;&gt; b &gt;&gt; m;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> d = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">bool</span> find = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> i = <span class="number">0</span>; i &lt; <span class="number">100</span>; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (d == b)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="built_in">cout</span> &lt;&lt; i &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">                find = <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            d = d * a % m;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (find) <span class="keyword">continue</span>;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> t, C = <span class="number">1</span>, num = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">while</span> ((t = gcd(a, m)) != <span class="number">1</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            m /= t;</span><br><span class="line">            b /= t;</span><br><span class="line">            C = C * a / t % m;</span><br><span class="line">            num++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> res = BSGS(C, a, b, m);</span><br><span class="line">        <span class="keyword">if</span> (res == <span class="number">-1</span>) <span class="built_in">cout</span> &lt;&lt; <span class="string">"No Solution"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">        <span class="keyword">else</span> <span class="built_in">cout</span> &lt;&lt; res + num &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="二次剩余"><a href="#二次剩余" class="headerlink" title="二次剩余"></a>二次剩余</h4><p>求二次同余方程的解 $x$ ，其中 $p$ 为奇质数：</p><p>$$<br>x^{2} \equiv n\ (\bmod \ p)<br>$$</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">quick_mod</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> a, <span class="keyword">long</span> <span class="keyword">long</span> b, <span class="keyword">long</span> <span class="keyword">long</span> m)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">1</span>;</span><br><span class="line">    a %= m;</span><br><span class="line">    <span class="keyword">while</span> (b)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (b &amp; <span class="number">1</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            ans = ans * a % m;</span><br><span class="line">            b--;</span><br><span class="line">        &#125;</span><br><span class="line">        b &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">        a = a * a % m;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">T</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> p, d;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> w;</span><br><span class="line"></span><br><span class="line"><span class="comment">//二次域乘法</span></span><br><span class="line"><span class="function">T <span class="title">multi_er</span><span class="params">(T a, T b, <span class="keyword">long</span> <span class="keyword">long</span> m)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    T ans;</span><br><span class="line">    ans.p = (a.p * b.p % m + a.d * b.d % m * w % m) % m;</span><br><span class="line">    ans.d = (a.p * b.d % m + a.d * b.p % m) % m;</span><br><span class="line">    <span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//二次域上快速幂</span></span><br><span class="line"><span class="function">T <span class="title">power</span><span class="params">(T a, <span class="keyword">long</span> <span class="keyword">long</span> b, <span class="keyword">long</span> <span class="keyword">long</span> m)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    T ans;</span><br><span class="line">    ans.p = <span class="number">1</span>;</span><br><span class="line">    ans.d = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (b)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (b &amp; <span class="number">1</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            ans = multi_er(ans, a, m);</span><br><span class="line">            b--;</span><br><span class="line">        &#125;</span><br><span class="line">        b &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">        a = multi_er(a, a, m);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//求勒让德符号</span></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">Legendre</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> a, <span class="keyword">long</span> <span class="keyword">long</span> p)</span> </span>&#123; <span class="keyword">return</span> quick_mod(a, (p - <span class="number">1</span>) &gt;&gt; <span class="number">1</span>, p); &#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">mod</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> a, <span class="keyword">long</span> <span class="keyword">long</span> m)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    a %= m;</span><br><span class="line">    <span class="keyword">if</span> (a &lt; <span class="number">0</span>) a += m;</span><br><span class="line">    <span class="keyword">return</span> a;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">Solve</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> n, <span class="keyword">long</span> <span class="keyword">long</span> p)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (p == <span class="number">2</span>) <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">if</span> (Legendre(n, p) + <span class="number">1</span> == p) <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> a = <span class="number">-1</span>, t;</span><br><span class="line"></span><br><span class="line">    srand(time(<span class="literal">nullptr</span>));</span><br><span class="line">    <span class="keyword">while</span> (<span class="literal">true</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        a = rand() % p;</span><br><span class="line">        t = a * a - n;</span><br><span class="line">        w = mod(t, p);</span><br><span class="line">        <span class="keyword">if</span> (Legendre(w, p) + <span class="number">1</span> == p) <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    T tmp;</span><br><span class="line">    tmp.p = a;</span><br><span class="line">    tmp.d = <span class="number">1</span>;</span><br><span class="line">    T ans = power(tmp, (p + <span class="number">1</span>) &gt;&gt; <span class="number">1</span>, p);</span><br><span class="line">    <span class="keyword">return</span> ans.p;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">// x*x = a (mod n)</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> a, n;</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; a &gt;&gt; n;</span><br><span class="line">    a %= n;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">auto</span> ans1 = Solve(a, n);</span><br><span class="line">    <span class="keyword">auto</span> ans2 = n - ans1;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (ans1 == <span class="number">-1</span>) <span class="built_in">cout</span> &lt;&lt; <span class="string">"No root"</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (ans1 == ans2) <span class="built_in">cout</span> &lt;&lt; ans1 &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="built_in">cout</span> &lt;&lt; ans1 &lt;&lt; <span class="string">" "</span> &lt;&lt; ans2 &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="快速傅里叶变换-FFT"><a href="#快速傅里叶变换-FFT" class="headerlink" title="快速傅里叶变换 FFT"></a>快速傅里叶变换 FFT</h4><h5 id="多项式乘法"><a href="#多项式乘法" class="headerlink" title="多项式乘法"></a>多项式乘法</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//计算多项式乘法F(x)*G(x)</span></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">输入</span></span><br><span class="line"><span class="comment">第一行2个正整数n, m</span></span><br><span class="line"><span class="comment">第二行n + 1个数字，从低到高表示F(x)的系数</span></span><br><span class="line"><span class="comment">第三行m + 1个数字，从低到高表示G(x)的系数</span></span><br><span class="line"><span class="comment">例子：</span></span><br><span class="line"><span class="comment">1 2</span></span><br><span class="line"><span class="comment">1 2</span></span><br><span class="line"><span class="comment">1 2 1</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">输出</span></span><br><span class="line"><span class="comment">一行n+m+1个数字，从低到高表示F(x)∗G(x)的系数</span></span><br><span class="line"><span class="comment">例子：</span></span><br><span class="line"><span class="comment">1 4 5 2</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">F(x) = 1 + 2*x</span></span><br><span class="line"><span class="comment">G(x) = 1 + 2*x + x^2</span></span><br><span class="line"><span class="comment">F(x)*G(x) = 1 + 4*x + 5*x^2 + 2*x^3</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> rg register int</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> MAXN = <span class="number">10000001</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">double</span> pi = <span class="built_in">acos</span>(<span class="number">-1</span>);</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Complex</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">double</span> r, i;</span><br><span class="line">    Complex() &#123;&#125;</span><br><span class="line">    Complex(<span class="keyword">double</span> a, <span class="keyword">double</span> b) :r(a), i(b) &#123;&#125;</span><br><span class="line">    Complex <span class="keyword">operator</span> + (<span class="keyword">const</span> Complex B) <span class="keyword">const</span> &#123; <span class="keyword">return</span> Complex(r + B.r, i + B.i); &#125;</span><br><span class="line">    Complex <span class="keyword">operator</span> - (<span class="keyword">const</span> Complex B) <span class="keyword">const</span> &#123; <span class="keyword">return</span> Complex(r - B.r, i - B.i); &#125;</span><br><span class="line">    Complex <span class="keyword">operator</span> * (<span class="keyword">const</span> Complex B) <span class="keyword">const</span> &#123; <span class="keyword">return</span> Complex(r*B.r - i * B.i, r*B.i + i * B.r); &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">Complex X, Y, a[MAXN], b[MAXN];</span><br><span class="line"><span class="keyword">int</span> r[MAXN], n, m, l;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">FFT</span><span class="params">(Complex *a, <span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">        <span class="keyword">if</span> (i &lt; r[i]) swap(a[i], a[r[i]]);</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">1</span>; i &lt; n; i &lt;&lt;= <span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function">Complex <span class="title">wn</span><span class="params">(<span class="built_in">cos</span>(pi / i), x*<span class="built_in">sin</span>(pi / i))</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (rg j = <span class="number">0</span>; j &lt; n; j += (i &lt;&lt; <span class="number">1</span>))</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="function">Complex <span class="title">w</span><span class="params">(<span class="number">1</span>, <span class="number">0</span>)</span></span>;</span><br><span class="line">            <span class="keyword">for</span> (rg k = <span class="number">0</span>; k &lt; i; ++k, w = w * wn)</span><br><span class="line">            &#123;</span><br><span class="line">                X = a[j + k], Y = a[i + j + k] * w;</span><br><span class="line">                a[j + k] = X + Y, a[i + j + k] = X - Y;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (x == <span class="number">-1</span>)</span><br><span class="line">        <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt; n; i++) a[i].r = a[i].r / n;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d%d"</span>, &amp;n, &amp;m);</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt;= n; i++) <span class="built_in">scanf</span>(<span class="string">"%lf"</span>, &amp;a[i].r);</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt;= m; i++) <span class="built_in">scanf</span>(<span class="string">"%lf"</span>, &amp;b[i].r);</span><br><span class="line">    m += n;</span><br><span class="line">    <span class="keyword">for</span> (n = <span class="number">1</span>; n &lt;= m; n &lt;&lt;= <span class="number">1</span>) l++;</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">        r[i] = (r[i &gt;&gt; <span class="number">1</span>] &gt;&gt; <span class="number">1</span>) | ((i &amp; <span class="number">1</span>) &lt;&lt; (l - <span class="number">1</span>));</span><br><span class="line">    FFT(a, <span class="number">1</span>);</span><br><span class="line">    FFT(b, <span class="number">1</span>);</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt;= n; i++) a[i] = a[i] * b[i];</span><br><span class="line">    FFT(a, <span class="number">-1</span>);</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt;= m; i++)</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"%d "</span>, (<span class="keyword">int</span>)(a[i].r + <span class="number">0.5</span>));</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h5 id="相同位数整数乘法"><a href="#相同位数整数乘法" class="headerlink" title="相同位数整数乘法"></a>相同位数整数乘法</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">输入</span></span><br><span class="line"><span class="comment">位数</span></span><br><span class="line"><span class="comment">整数1</span></span><br><span class="line"><span class="comment">整数2</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> rg register int</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> MAXN = <span class="number">1000001</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">double</span> pi = <span class="built_in">acos</span>(<span class="number">-1</span>);</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Complex</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">double</span> r, i;</span><br><span class="line">    Complex() &#123;&#125;</span><br><span class="line">    Complex(<span class="keyword">double</span> a, <span class="keyword">double</span> b) :r(a), i(b) &#123;&#125;</span><br><span class="line">    Complex <span class="keyword">operator</span> + (<span class="keyword">const</span> Complex B) <span class="keyword">const</span> &#123; <span class="keyword">return</span> Complex(r + B.r, i + B.i); &#125;</span><br><span class="line">    Complex <span class="keyword">operator</span> - (<span class="keyword">const</span> Complex B) <span class="keyword">const</span> &#123; <span class="keyword">return</span> Complex(r - B.r, i - B.i); &#125;</span><br><span class="line">    Complex <span class="keyword">operator</span> * (<span class="keyword">const</span> Complex B) <span class="keyword">const</span> &#123; <span class="keyword">return</span> Complex(r*B.r - i * B.i, r*B.i + i * B.r); &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">Complex X, Y, a[MAXN], b[MAXN];</span><br><span class="line"><span class="keyword">int</span> n, m, l, r[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">FFT</span><span class="params">(Complex *a, <span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">        <span class="keyword">if</span> (i &lt; r[i]) swap(a[i], a[r[i]]);</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">1</span>; i &lt; n; i &lt;&lt;= <span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function">Complex <span class="title">wn</span><span class="params">(<span class="built_in">cos</span>(pi / i), x*<span class="built_in">sin</span>(pi / i))</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (rg j = <span class="number">0</span>; j &lt; n; j += (i &lt;&lt; <span class="number">1</span>))</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="function">Complex <span class="title">w</span><span class="params">(<span class="number">1</span>, <span class="number">0</span>)</span></span>;</span><br><span class="line">            <span class="keyword">for</span> (rg k = <span class="number">0</span>; k &lt; i; ++k, w = w * wn)</span><br><span class="line">            &#123;</span><br><span class="line">                X = a[j + k], Y = a[i + j + k] * w;</span><br><span class="line">                a[j + k] = X + Y, a[i + j + k] = X - Y;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (x == <span class="number">-1</span>) <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt; n; i++) a[i].r = a[i].r / n;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">char</span> ch1[MAXN], ch2[MAXN];</span><br><span class="line"><span class="keyword">int</span> res[MAXN];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;n);</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; ch1;</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; ch2;</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        a[i].r = ch1[n - i - <span class="number">1</span>] - <span class="string">'0'</span>;</span><br><span class="line">        b[i].r = ch2[n - i - <span class="number">1</span>] - <span class="string">'0'</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    m = n + n - <span class="number">2</span>;</span><br><span class="line">    <span class="keyword">for</span> (n = <span class="number">1</span>; n &lt;= m; n &lt;&lt;= <span class="number">1</span>) l++;</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">        r[i] = (r[i &gt;&gt; <span class="number">1</span>] &gt;&gt; <span class="number">1</span>) | ((i &amp; <span class="number">1</span>) &lt;&lt; (l - <span class="number">1</span>));</span><br><span class="line">    FFT(a, <span class="number">1</span>);</span><br><span class="line">    FFT(b, <span class="number">1</span>);</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt;= n; i++) a[i] = a[i] * b[i];</span><br><span class="line">    FFT(a, <span class="number">-1</span>);</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt;= m; i++) res[i] = (<span class="keyword">int</span>)(a[i].r + <span class="number">0.5</span>);</span><br><span class="line">    <span class="keyword">for</span> (rg i = <span class="number">0</span>; i &lt;= m; i++) res[i + <span class="number">1</span>] += res[i] / <span class="number">10</span>, res[i] %= <span class="number">10</span>;</span><br><span class="line">    rg top = m + <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">while</span> (res[top] &gt; <span class="number">9</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        res[top + <span class="number">1</span>] = res[top] / <span class="number">10</span>;</span><br><span class="line">        res[top] %= <span class="number">10</span>;</span><br><span class="line">        top++;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">while</span> (!res[top]) top--;</span><br><span class="line">    <span class="keyword">for</span> (rg i = top; i &gt;= <span class="number">0</span>; i--)</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"%d"</span>, res[i]);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h5 id="任意整数乘法"><a href="#任意整数乘法" class="headerlink" title="任意整数乘法"></a>任意整数乘法</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//较复杂</span></span><br><span class="line"><span class="comment">//时间较慢</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">500100</span>; <span class="comment">//至少是数据长度的4倍</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">double</span> PI = <span class="built_in">acos</span>(<span class="number">-1.0</span>);</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Complex</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">double</span> r, i;</span><br><span class="line">    Complex(<span class="keyword">double</span> _r = <span class="number">0.0</span>, <span class="keyword">double</span> _i = <span class="number">0.0</span>) &#123; r = _r; i = _i; &#125;</span><br><span class="line">    Complex <span class="keyword">operator</span> + (<span class="keyword">const</span> Complex &amp;b) &#123; <span class="keyword">return</span> Complex(r + b.r, i + b.i); &#125;</span><br><span class="line">    Complex <span class="keyword">operator</span> - (<span class="keyword">const</span> Complex &amp;b) &#123; <span class="keyword">return</span> Complex(r - b.r, i - b.i); &#125;</span><br><span class="line">    Complex <span class="keyword">operator</span> * (<span class="keyword">const</span> Complex &amp;b) &#123; <span class="keyword">return</span> Complex(r*b.r - i * b.i, r*b.i + i * b.r); &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">change</span><span class="params">(Complex y[], <span class="keyword">int</span> len)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> k;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>, j = len / <span class="number">2</span>; i &lt; len - <span class="number">1</span>; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (i &lt; j) swap(y[i], y[j]);</span><br><span class="line">        k = len / <span class="number">2</span>;</span><br><span class="line">        <span class="keyword">while</span> (j &gt;= k)</span><br><span class="line">        &#123;</span><br><span class="line">            j -= k;</span><br><span class="line">            k /= <span class="number">2</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (j &lt; k) j += k;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//做FFT，len必须为2^k形式，on==1时是DFT，on==-1时是IDFT</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">fft</span><span class="params">(Complex y[], <span class="keyword">int</span> len, <span class="keyword">int</span> on)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    change(y, len);</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> h = <span class="number">2</span>; h &lt;= len; h &lt;&lt;= <span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function">Complex <span class="title">wn</span><span class="params">(<span class="built_in">cos</span>(-on * <span class="number">2</span> * PI / h), <span class="built_in">sin</span>(-on * <span class="number">2</span> * PI / h))</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; len; j += h)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="function">Complex <span class="title">w</span><span class="params">(<span class="number">1</span>, <span class="number">0</span>)</span></span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> k = j; k &lt; j + h / <span class="number">2</span>; k++)</span><br><span class="line">            &#123;</span><br><span class="line">                Complex u = y[k];</span><br><span class="line">                Complex t = w * y[k + h / <span class="number">2</span>];</span><br><span class="line">                y[k] = u + t;</span><br><span class="line">                y[k + h / <span class="number">2</span>] = u - t;</span><br><span class="line">                w = w * wn;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (on == <span class="number">-1</span>)</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len; i++) y[i].r /= len;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">char</span> num1[maxn], num2[maxn];</span><br><span class="line">Complex x1[maxn], x2[maxn];</span><br><span class="line"><span class="keyword">int</span> ans[maxn];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">while</span> (<span class="built_in">cin</span> &gt;&gt; num1 &gt;&gt; num2)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">memset</span>(ans, <span class="number">0</span>, <span class="keyword">sizeof</span>(ans));</span><br><span class="line">        <span class="keyword">int</span> len = <span class="number">1</span>, len1 = <span class="built_in">strlen</span>(num1), len2 = <span class="built_in">strlen</span>(num2);</span><br><span class="line">        <span class="keyword">while</span> (len &lt; len1 + len2 + <span class="number">1</span>) len &lt;&lt;= <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len1; i++) x1[len1 - <span class="number">1</span> - i] = Complex((<span class="keyword">double</span>)(num1[i] - <span class="string">'0'</span>), <span class="number">0</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = len1; i &lt; len; i++) x1[i] = Complex(<span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">        fft(x1, len, <span class="number">1</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len2; i++) x2[len2 - <span class="number">1</span> - i] = Complex((<span class="keyword">double</span>)(num2[i] - <span class="string">'0'</span>), <span class="number">0</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = len2; i &lt; len; i++) x2[i] = Complex(<span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">        fft(x2, len, <span class="number">1</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len; i++) x1[i] = x1[i] * x2[i];</span><br><span class="line">        fft(x1, len, <span class="number">-1</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len; i++) ans[i] = (<span class="keyword">int</span>)(x1[i].r + <span class="number">0.5</span>);</span><br><span class="line">        </span><br><span class="line">        <span class="comment">// 进位</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; len; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            ans[i] += ans[i - <span class="number">1</span>] / <span class="number">10</span>;</span><br><span class="line">            ans[i - <span class="number">1</span>] %= <span class="number">10</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">while</span> (len &gt; <span class="number">0</span> &amp;&amp; !ans[len]) len--;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = len; i &gt;= <span class="number">0</span>; i--) <span class="built_in">printf</span>(<span class="string">"%c"</span>, ans[i] + <span class="string">'0'</span>);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="快速幂"><a href="#快速幂" class="headerlink" title="快速幂"></a>快速幂</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//O(logN) x^n</span></span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">qkpow</span><span class="params">(<span class="keyword">double</span> x, <span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">const</span> <span class="keyword">auto</span> flag = n &gt;= <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">auto</span> <span class="built_in">pow</span> = <span class="built_in">abs</span>(<span class="keyword">static_cast</span>&lt;<span class="keyword">long</span> <span class="keyword">long</span>&gt;(n));</span><br><span class="line">    <span class="keyword">double</span> ans = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (<span class="built_in">pow</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">pow</span> &amp; <span class="number">1</span>) ans *= x;</span><br><span class="line">        x *= x;</span><br><span class="line">        <span class="built_in">pow</span> &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> flag ? ans : <span class="number">1</span> / ans;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">qkpow</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x, <span class="keyword">long</span> <span class="keyword">long</span> n, <span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> mod)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">1</span>;</span><br><span class="line">    x %= mod;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (n)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (n &amp; <span class="number">1</span>) ans = (ans * x) % mod;</span><br><span class="line">        x = (x * x) % mod;</span><br><span class="line">        n &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> ans % mod;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="斐波那契数列"><a href="#斐波那契数列" class="headerlink" title="斐波那契数列"></a>斐波那契数列</h4><p>通项：</p><p>$$<br>a_{1}=1, a_{2}=1, a_{n}=a_{n-1}+a_{n-2}\left(n \geq 3, n \in N^{*}\right)<br>$$</p><p>$$<br>a_{n}=1 / \sqrt{5}\left[\left(\frac{1+\sqrt{5}}{2}\right)^{n}-\left(\frac{1-\sqrt{5}}{2}\right)^{n}\right]<br>$$</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 求第n项，模mod</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> mod(a, m) ((a) % (m) + (m)) % (m)</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> MOD = <span class="number">1e9</span> + <span class="number">9</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">MATRIX</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> a[<span class="number">2</span>][<span class="number">2</span>];</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">MATRIX a;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> f[<span class="number">2</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ANS_Cf</span><span class="params">(MATRIX a)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    f[<span class="number">0</span>] = mod(a.a[<span class="number">0</span>][<span class="number">0</span>] + a.a[<span class="number">1</span>][<span class="number">0</span>], MOD);</span><br><span class="line">    f[<span class="number">1</span>] = mod(a.a[<span class="number">0</span>][<span class="number">1</span>] + a.a[<span class="number">1</span>][<span class="number">1</span>], MOD);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">MATRIX <span class="title">MATRIX_Cf</span><span class="params">(MATRIX a, MATRIX b)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    MATRIX ans;</span><br><span class="line">    <span class="keyword">int</span> k;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">2</span>; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; <span class="number">2</span>; j++)</span><br><span class="line">        &#123;</span><br><span class="line">            ans.a[i][j] = <span class="number">0</span>;</span><br><span class="line">            k = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">while</span> (k &lt; <span class="number">2</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                ans.a[i][j] += a.a[k][i] * b.a[j][k];</span><br><span class="line">                ans.a[i][j] = mod(ans.a[i][j], MOD);</span><br><span class="line">                ++k;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">MATRIX <span class="title">MATRIX_Pow</span><span class="params">(MATRIX a, <span class="keyword">long</span> <span class="keyword">long</span> n)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    MATRIX ans;</span><br><span class="line">    ans.a[<span class="number">0</span>][<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">    ans.a[<span class="number">1</span>][<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line">    ans.a[<span class="number">0</span>][<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line">    ans.a[<span class="number">1</span>][<span class="number">0</span>] = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (n)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (n &amp; <span class="number">1</span>) ans = MATRIX_Cf(ans, a);</span><br><span class="line">        n = n &gt;&gt; <span class="number">1</span>;</span><br><span class="line">        a = MATRIX_Cf(a, a);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">fib</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> n)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (n == <span class="number">1</span>) <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">    a.a[<span class="number">0</span>][<span class="number">0</span>] = a.a[<span class="number">0</span>][<span class="number">1</span>] = a.a[<span class="number">1</span>][<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">    a.a[<span class="number">1</span>][<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line">    a = MATRIX_Pow(a, n - <span class="number">2</span>);</span><br><span class="line">    ANS_Cf(a);</span><br><span class="line">    <span class="keyword">return</span> f[<span class="number">0</span>];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="素数"><a href="#素数" class="headerlink" title="素数"></a>素数</h4><h5 id="试商法"><a href="#试商法" class="headerlink" title="试商法"></a>试商法</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//试商法</span></span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">isPrime</span><span class="params">(<span class="keyword">const</span> <span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (x &lt; <span class="number">2</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">2</span>; i * i &lt;= x; i++)</span><br><span class="line">        <span class="keyword">if</span> (x % i == <span class="number">0</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h5 id="打表法"><a href="#打表法" class="headerlink" title="打表法"></a>打表法</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//O(n*loglogn)</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> n = <span class="number">1000</span>;</span><br><span class="line"><span class="keyword">int</span> a[n + <span class="number">5</span>] = &#123;<span class="number">1</span>, <span class="number">1</span>&#125;;</span><br><span class="line"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; v;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">2</span>; i &lt;= n; i++)</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> j = i * <span class="number">2</span>; j &lt;= n; j += i) a[j] = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">1</span>; i &lt;= n; i++)</span><br><span class="line">    <span class="keyword">if</span> (a[i] == <span class="number">0</span>) v.emplace_back(i); <span class="comment">// 素数 a[i]==0</span></span><br></pre></td></tr></table></figure><hr><h4 id="素因子"><a href="#素因子" class="headerlink" title="素因子"></a>素因子</h4><h5 id="直接求"><a href="#直接求" class="headerlink" title="直接求"></a>直接求</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 查询数的所有不重复素因子</span></span><br><span class="line"><span class="comment">// 暴力 O(sqrt(n))</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">getf</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; &amp;v, <span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i * i &lt;= x; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (x % i == <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            v.push_back(i);</span><br><span class="line">            <span class="keyword">while</span> (x % i == <span class="number">0</span>) x /= i;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (x == <span class="number">1</span>) <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (x != <span class="number">1</span>) v.push_back(x);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 对数进行分解质因数</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">getf</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; &amp;v, <span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i * i &lt;= x; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">while</span> (x % i == <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            v.push_back(i);</span><br><span class="line">            x /= i;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (x == <span class="number">1</span>) <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (x != <span class="number">1</span>) v.push_back(x);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h5 id="打表法-1"><a href="#打表法-1" class="headerlink" title="打表法"></a>打表法</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 筛每个数的最小素因子</span></span><br><span class="line"><span class="comment">// 预处理 O(nloglogn)</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> MAXN = <span class="number">100000</span> + <span class="number">50</span>;</span><br><span class="line"><span class="keyword">int</span> spf[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">init_spf</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i &lt; MAXN - <span class="number">5</span>; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!spf[i])</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = i; j &lt; MAXN - <span class="number">5</span>; j += i)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (!spf[j]) spf[j] = i;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// O(logn)</span></span><br><span class="line"><span class="comment">// 查询数的所有不重复素因子</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">getf</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; &amp;v, <span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">while</span> (x &gt; <span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> p = spf[x];</span><br><span class="line">        v.push_back(p);</span><br><span class="line">        <span class="keyword">while</span> (x % p == <span class="number">0</span>) x /= p;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 对数进行分解质因数</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">getf</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; &amp;v, <span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">while</span> (x &gt; <span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> p = spf[x];</span><br><span class="line">        <span class="keyword">while</span> (x % p == <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            v.push_back(p);</span><br><span class="line">            x /= p;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="逆元"><a href="#逆元" class="headerlink" title="逆元"></a>逆元</h4><h5 id="定义-1"><a href="#定义-1" class="headerlink" title="定义"></a>定义</h5><p>如果有 $a*b\equiv 1 \pmod{p}$ 且 $gcd(a,p)=1$ （a与p互质），则称b是模p意义下a的乘法逆元，记 $b=inv(a)$ 或 $b=a^{−1}$</p><p>(定义了模意义下的除法运算：除以一个数取模等于乘以这个数的逆元取模)</p><hr><h5 id="求法-1"><a href="#求法-1" class="headerlink" title="求法"></a>求法</h5><h6 id="费马小定理-1"><a href="#费马小定理-1" class="headerlink" title="费马小定理"></a>费马小定理</h6><p>由费马小定理得 $a^p-a \equiv 0 \pmod{p}$</p><p>即 $a^p \equiv a \pmod{p}$</p><p>即 $a^{p-1} \equiv 1 \pmod{p}$</p><p>即 $a*a^{p-2} \equiv 1 \pmod{p}$</p><p>当模数p为质数时， $a^{p-2}$ 即为a在模p意义下的逆元，快速幂求解即可，时间复杂度O(logn)</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//模数MOD为质数</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> MOD = <span class="number">1e9</span> + <span class="number">7</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">powMod</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> a, <span class="keyword">long</span> <span class="keyword">long</span> b)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (a %= MOD; b; b &gt;&gt;= <span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (b &amp; <span class="number">1</span>) ans = ans * a % MOD;</span><br><span class="line">        a = a * a % MOD;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">inv</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x)</span> </span>&#123; <span class="keyword">return</span> powMod(x, MOD - <span class="number">2</span>); &#125;</span><br></pre></td></tr></table></figure><hr><h6 id="扩展欧几里得法"><a href="#扩展欧几里得法" class="headerlink" title="扩展欧几里得法"></a>扩展欧几里得法</h6><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//扩展欧几里得法，gcd(a, MOD) = 1时有逆元</span></span><br><span class="line"><span class="comment">//O(logn)</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> MOD = <span class="number">1e9</span> + <span class="number">7</span>;</span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">exgcd</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> a, <span class="keyword">long</span> <span class="keyword">long</span> b, <span class="keyword">long</span> <span class="keyword">long</span> &amp;x, <span class="keyword">long</span> <span class="keyword">long</span> &amp;y)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (b == <span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        x = <span class="number">1</span>;</span><br><span class="line">        y = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">return</span> a;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> d = exgcd(b, a % b, y, x);</span><br><span class="line">    y -= a / b * x;</span><br><span class="line">    <span class="keyword">return</span> d;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">inv</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> a)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> x, y;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> d = exgcd(a, MOD, x, y);</span><br><span class="line">    <span class="keyword">if</span> (d == <span class="number">1</span>) <span class="keyword">return</span> (x % MOD + MOD) % MOD;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h6 id="打表法-2"><a href="#打表法-2" class="headerlink" title="打表法"></a>打表法</h6><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> MOD = <span class="number">1e9</span> + <span class="number">7</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> inv[<span class="number">10000</span>];</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">initInv</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    inv[<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i &lt; <span class="number">10000</span>; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        inv[i] = <span class="number">1L</span>L * (MOD - MOD / i) * inv[MOD % i] % MOD;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="中国剩余定理"><a href="#中国剩余定理" class="headerlink" title="中国剩余定理"></a>中国剩余定理</h4><p>孙子定理：有物不知其数，三三数之剩二，五五数之剩三，七七数之剩二。问物几何？</p><p>求解同余方程组</p><p>$$<br>\left{\begin{array}{l}{x \equiv a_{1}\left(\bmod m_{1}\right)} \ {x \equiv a_{2}\left(\bmod m_{2}\right)} \ {x \equiv a_{3}\left(\bmod m_{3}\right)} \ {\ldots} \ {x \equiv a_{k}\left(\bmod m_{k}\right)}\end{array}\right.<br>$$</p><p>其中 $m_{1}, m_{2}, m_{3} \dots m_{k}$ 为两两互质的整数</p><p>求 $x$ 的最小非负整数解</p><p>解：</p><p>令 $M=\prod_{i=1}^{k} m_{i}$ ，即 $M$ 是所有 $m_i$ 的最小公倍数</p><p>$t_i$ 为 $\frac{M}{m_{i}}$ 模 $m_i$ 的逆元，即 $\frac{M}{m_{i}} t_{i} \equiv 1\left(\bmod m_{i}\right)$ 的最小非负整数解</p><p>则有一个解为 $x=\sum_{i=1}^{k} a_{i} \frac{M}{m_{i}} t_{i}$</p><p>通解为 $x+i * M(i \in Z)$</p><p>特别的，最小非负整数解为 (x%M+M)%M</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">china</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> k; <span class="comment">// 方程组数</span></span><br><span class="line">    <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; m; <span class="comment">//方程中的m</span></span><br><span class="line">    <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; a; <span class="comment">//方程中的a</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> ans = <span class="number">0</span>, lcm = <span class="number">1</span>, x, y;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= k; ++i) lcm *= m[i];</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= k; ++i)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> tp = lcm / m[i];</span><br><span class="line">        exgcd(tp, m[i], x, y);</span><br><span class="line">        x = (x % m[i] + m[i]) % m[i]; <span class="comment">//x要为最小非负整数解</span></span><br><span class="line">        ans = (ans + tp * x * a[i]) % lcm;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> (ans + lcm) % lcm;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="整数运算"><a href="#整数运算" class="headerlink" title="整数运算"></a>整数运算</h4><h5 id="大整数"><a href="#大整数" class="headerlink" title="大整数"></a>大整数</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//2的n次方可以用pow直接算</span></span><br><span class="line"><span class="comment">//UTF-8 使用限定</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstdlib&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;list&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;map&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;fstream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> BIGNUM_DEBUG 2333</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Bignum</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">mknum</span><span class="params">(<span class="keyword">const</span> <span class="keyword">char</span> *s, <span class="keyword">int</span> len = <span class="number">-1</span>)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        sign = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">if</span> (*s == <span class="string">'-'</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            mknum(s + <span class="number">1</span>);</span><br><span class="line">            sign = <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">int</span> l;</span><br><span class="line">        <span class="keyword">if</span> (len == <span class="number">-1</span>) l = <span class="built_in">strlen</span>(s);</span><br><span class="line">        <span class="keyword">else</span> l = len;</span><br><span class="line">        l = <span class="built_in">strlen</span>(s);</span><br><span class="line">        bits.clear();</span><br><span class="line">        bits.resize(l);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = l - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) bits[l - i - <span class="number">1</span>] = s[i] - <span class="string">'0'</span>;</span><br><span class="line">        maintain();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">mknum</span><span class="params">(<span class="built_in">string</span> &amp;s)</span> </span>&#123; mknum(s.c_str(), s.length()); &#125;</span><br><span class="line">    <span class="comment">///////////////////////////////////////////////////////////////////</span></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">us_addto</span><span class="params">(Bignum &amp;b)</span>  <span class="comment">// unsigned add to</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> mlen = max(b.bits.size(), bits.size());</span><br><span class="line">        <span class="keyword">int</span> slen = bits.size();</span><br><span class="line">        <span class="keyword">int</span> olen = b.bits.size();</span><br><span class="line">        bits.resize(mlen);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; mlen; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">int</span> s = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">if</span> (i &lt; slen)s += bits[i];</span><br><span class="line">            <span class="keyword">if</span> (i &lt; olen)s += b.bits[i];</span><br><span class="line">            bits[i] = s;</span><br><span class="line">        &#125;</span><br><span class="line">        maintain();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="class"><span class="keyword">class</span> <span class="title">FFTer</span></span></span><br><span class="line"><span class="class">    &#123;</span></span><br><span class="line">        <span class="class"><span class="keyword">class</span> <span class="title">Complex</span></span></span><br><span class="line"><span class="class">        &#123;</span></span><br><span class="line">        <span class="keyword">public</span>:</span><br><span class="line">            <span class="keyword">double</span> real, image;</span><br><span class="line">            Complex(<span class="keyword">double</span> a = <span class="number">0</span>, <span class="keyword">double</span> b = <span class="number">0</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                real = a;</span><br><span class="line">                image = b;</span><br><span class="line">            &#125;</span><br><span class="line">            Complex <span class="keyword">operator</span> + (<span class="keyword">const</span> Complex &amp;o) &#123; <span class="keyword">return</span> Complex(real + o.real, image + o.image); &#125;</span><br><span class="line">            Complex <span class="keyword">operator</span> - (<span class="keyword">const</span> Complex &amp;o) &#123; <span class="keyword">return</span> Complex(real - o.real, image - o.image); &#125;</span><br><span class="line">            Complex <span class="keyword">operator</span> * (<span class="keyword">const</span> Complex &amp;o) &#123; <span class="keyword">return</span> Complex(real*o.real - image * o.image, real*o.image + o.real*image); &#125;</span><br><span class="line">            Complex <span class="keyword">operator</span> * (<span class="keyword">double</span> k) &#123; <span class="keyword">return</span> Complex(real*k, image*k); &#125;</span><br><span class="line">            Complex <span class="keyword">operator</span> / (<span class="keyword">double</span> k) &#123; <span class="keyword">return</span> Complex(real / k, image / k); &#125;</span><br><span class="line">        &#125;;</span><br><span class="line">    <span class="keyword">public</span>:</span><br><span class="line">        <span class="built_in">vector</span>&lt;Complex&gt; a;  <span class="comment">//系数向量</span></span><br><span class="line">        <span class="keyword">int</span> n;              <span class="comment">//多项式次数上界</span></span><br><span class="line">        FFTer(<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; &amp;vec)</span><br><span class="line">        &#123;</span><br><span class="line">            a.resize(vec.size());</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; vec.size(); i++) a[i].real = vec[i];</span><br><span class="line">            n = vec.size();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">transform</span><span class="params">()</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">            <span class="keyword">int</span> j = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">int</span> k;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (j &gt; i) swap(a[i], a[j]);</span><br><span class="line">                k = n;</span><br><span class="line">                <span class="keyword">while</span> (j &amp; (k &gt;&gt;= <span class="number">1</span>)) j &amp;= ~k;</span><br><span class="line">                j |= k;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">FFT</span><span class="params">(<span class="keyword">bool</span> IDFT = <span class="literal">false</span>)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="keyword">double</span> Pi = IDFT ? -<span class="built_in">acos</span>(<span class="number">-1.0</span>) : <span class="built_in">acos</span>(<span class="number">-1.0</span>);</span><br><span class="line">            <span class="comment">//IDFT与DFT选择方向相反（符号相反）</span></span><br><span class="line">            transform();<span class="comment">//交换元素（翻转二进制位，具体看下面注释，再具体看算导</span></span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> s = <span class="number">1</span>; s &lt; n; s &lt;&lt;= <span class="number">1</span>)</span><br><span class="line">                <span class="comment">//算法导论上是fot s = 1 to lgn,考虑到精度问题改为上面那个...</span></span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">int</span> t = <span class="number">0</span>; t &lt; n; t += s &lt;&lt; <span class="number">1</span>)</span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="comment">//合并[t, t+s-1]与 [t+s, t+2*s-1] (算导上以指数形式给出，注意到他的s....)</span></span><br><span class="line">                    <span class="comment">//合并为[t, t+2*s-1] (看起来像是废话) (有示例图在算导上，画得很形象的)</span></span><br><span class="line">                    <span class="keyword">double</span> x = Pi / s;</span><br><span class="line">                    <span class="function">Complex <span class="title">omgn</span><span class="params">(<span class="built_in">cos</span>(x), <span class="built_in">sin</span>(x))</span></span>;</span><br><span class="line">                    <span class="function">Complex <span class="title">omg</span><span class="params">(<span class="number">1.0</span>, <span class="number">0.0</span>)</span></span>;    <span class="comment">//单位向量</span></span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">int</span> m = <span class="number">0</span>; m &lt; s; m++)</span><br><span class="line">                    &#123;            <span class="comment">//旋转</span></span><br><span class="line">                        <span class="keyword">int</span> a1 = m + t;</span><br><span class="line">                        <span class="keyword">int</span> a2 = m + t + s;   <span class="comment">//取两边系数向量的系数</span></span><br><span class="line">                        <span class="comment">//算导上管这个叫公共子表达式消除</span></span><br><span class="line">                        <span class="comment">//其实就是一个变量计算一次然后保存下来用多次</span></span><br><span class="line">                        Complex comm = omg * a[a2];</span><br><span class="line">                        a[a2] = a[a1] - comm;</span><br><span class="line">                        a[a1] = a[a1] + comm;  <span class="comment">//这两个顺序不要反了</span></span><br><span class="line">                        omg = omg * omgn;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            <span class="keyword">if</span> (IDFT)</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++) a[i] = a[i] / n;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function"><span class="keyword">void</span> <span class="title">mul</span><span class="params">(FFTer &amp;o)</span></span></span><br><span class="line"><span class="function">        </span>&#123;</span><br><span class="line">            <span class="keyword">int</span> s = <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">while</span> (s &lt; n + o.n)s &lt;&lt;= <span class="number">1</span>;</span><br><span class="line">            n = o.n = s;</span><br><span class="line">            a.resize(s);</span><br><span class="line">            o.a.resize(s);</span><br><span class="line">            FFT(<span class="literal">false</span>);</span><br><span class="line">            o.FFT(<span class="literal">false</span>);</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++) a[i] = a[i] * o.a[i];</span><br><span class="line">            FFT(<span class="literal">true</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">us_multo</span><span class="params">(Bignum &amp;b)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="function">FFTer <span class="title">x</span><span class="params">(bits)</span></span>;</span><br><span class="line">        <span class="function">FFTer <span class="title">y</span><span class="params">(b.bits)</span></span>;</span><br><span class="line">        x.mul(y);</span><br><span class="line">        bits.clear();</span><br><span class="line">        bits.resize(x.a.size());</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; x.n; i++) bits[i] = (<span class="keyword">int</span>)(x.a[i].real + <span class="number">0.5</span>);</span><br><span class="line">        maintain();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">us_multo_simu</span><span class="params">(Bignum &amp;b)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; r;</span><br><span class="line">        r.resize(max(length(), b.length()) &lt;&lt; <span class="number">1</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; length(); i++)</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; b.length(); j++) r[i + j] += bits[i] * b.bits[j];</span><br><span class="line">        *(&amp;(<span class="keyword">this</span>-&gt;bits)) = r;</span><br><span class="line">        maintain();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">us_subto</span><span class="params">(Bignum &amp;b)</span> <span class="comment">// abs(self) &gt;= abs(other)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> mlen = length();</span><br><span class="line">        <span class="keyword">int</span> olen = b.length();</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; mlen; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">int</span> s = bits[i];</span><br><span class="line">            <span class="keyword">if</span> (i &lt; olen) s -= b.bits[i];</span><br><span class="line">            bits[i] = s;</span><br><span class="line">            <span class="keyword">if</span> (bits[i] &lt; <span class="number">0</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                bits[i] += <span class="number">10</span>;</span><br><span class="line">                bits[i + <span class="number">1</span>] -= <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = bits.size() - <span class="number">1</span>; !bits[i] &amp;&amp; i &gt;= <span class="number">1</span>; i--) bits.pop_back();</span><br><span class="line">        <span class="keyword">if</span> (bits.size() == <span class="number">1</span> &amp;&amp; bits[<span class="number">0</span>] == <span class="number">0</span>) sign = <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">us_divto</span><span class="params">(Bignum &amp;b)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (length() == <span class="number">1</span> &amp;&amp; bits[<span class="number">0</span>] == <span class="number">0</span>) <span class="keyword">return</span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">L</span><span class="params">(<span class="string">"0"</span>)</span></span>;</span><br><span class="line">        L.sign = <span class="number">0</span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">R</span><span class="params">(*<span class="keyword">this</span>)</span></span>;</span><br><span class="line">        R.sign = <span class="number">0</span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">two</span><span class="params">(<span class="string">"2"</span>)</span></span>;</span><br><span class="line">        R *= two;</span><br><span class="line">        <span class="function">Bignum <span class="title">one</span><span class="params">(<span class="string">"1"</span>)</span></span>;</span><br><span class="line">        one.sign = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">while</span> (L + one != R)</span><br><span class="line">        &#123;</span><br><span class="line">            Bignum M = L + R;</span><br><span class="line">            M.divto2();</span><br><span class="line">            Bignum t = M * b;</span><br><span class="line">            <span class="keyword">if</span> (t &gt; *<span class="keyword">this</span>) R = M;</span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (t &lt; *<span class="keyword">this</span>) L = M;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                *<span class="keyword">this</span> = M;</span><br><span class="line">                L = M;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        *<span class="keyword">this</span> = L;</span><br><span class="line">    &#125;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="keyword">int</span> sign;</span><br><span class="line">    <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; bits;</span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">length</span><span class="params">()</span> </span>&#123; <span class="keyword">return</span> bits.size(); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">maintain</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; bits.size(); i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (i + <span class="number">1</span> &lt; bits.size()) bits[i + <span class="number">1</span>] += bits[i] / <span class="number">10</span>;</span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (bits[i] &gt; <span class="number">9</span>) bits.push_back(bits[i] / <span class="number">10</span>);</span><br><span class="line">            bits[i] %= <span class="number">10</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (bits.size() == <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            bits.push_back(<span class="number">0</span>);</span><br><span class="line">            sign = <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = bits.size() - <span class="number">1</span>; !bits[i] &amp;&amp; i &gt;= <span class="number">1</span>; i--) bits.pop_back();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Bignum(<span class="built_in">string</span> &amp;s)</span><br><span class="line">    &#123;</span><br><span class="line">        Bignum();</span><br><span class="line">        mknum(s);</span><br><span class="line">    &#125;</span><br><span class="line">    Bignum(<span class="keyword">const</span> <span class="keyword">char</span> *s)</span><br><span class="line">    &#123;</span><br><span class="line">        Bignum();</span><br><span class="line">        mknum(s);</span><br><span class="line">    &#125;</span><br><span class="line">    Bignum(<span class="keyword">int</span> n)</span><br><span class="line">    &#123;</span><br><span class="line">        Bignum();</span><br><span class="line">        <span class="keyword">char</span> buf[<span class="number">15</span>];</span><br><span class="line">        <span class="built_in">sprintf</span>(buf, <span class="string">"%d"</span>, n);</span><br><span class="line">        mknum(buf);</span><br><span class="line">    &#125;</span><br><span class="line">    Bignum()</span><br><span class="line">    &#123;</span><br><span class="line">        sign = <span class="number">0</span>;</span><br><span class="line">        bits.push_back(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    Bignum(<span class="keyword">const</span> Bignum&amp; b)</span><br><span class="line">    &#123;</span><br><span class="line">        copy(b);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">copy</span><span class="params">(<span class="keyword">const</span> Bignum&amp; b)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        sign = b.sign;</span><br><span class="line">        bits = b.bits;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">///////////////////////////////////////////////////</span></span><br><span class="line">    <span class="function"><span class="keyword">bool</span> <span class="title">us_cmp</span><span class="params">(Bignum &amp;b)</span>   <span class="comment">//无符号的比较</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (length() != b.length()) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">int</span> l = length();</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; l; i++)</span><br><span class="line">            <span class="keyword">if</span> (bits[i] != b.bits[i]) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">bool</span> <span class="title">us_larger</span><span class="params">(Bignum &amp;b)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (length() &gt; b.length()) <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> (length() &lt; b.length()) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">int</span> l = length();</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = l - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--)</span><br><span class="line">            <span class="keyword">if</span> (bits[i] &gt; b.bits[i]) <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (bits[i] &lt; b.bits[i]) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> == (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (sign != o.sign) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">return</span> us_cmp(o);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> != (Bignum &amp;o) &#123; <span class="keyword">return</span> !(*<span class="keyword">this</span> == o); &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> &gt; (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (sign == <span class="number">0</span> &amp;&amp; o.sign == <span class="number">1</span>) <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        <span class="keyword">if</span> (sign == <span class="number">1</span> &amp;&amp; o.sign == <span class="number">0</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">if</span> (sign == o.sign &amp;&amp; sign) <span class="keyword">return</span> !us_larger(o);</span><br><span class="line">        <span class="keyword">return</span> us_larger(o);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> &lt; (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> !(*<span class="keyword">this</span> == o || *<span class="keyword">this</span> &gt; o);   <span class="comment">//小于就是不等于也不大于</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> &lt;= (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span> &lt; o || *<span class="keyword">this</span> == o;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> &gt;= (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span> &gt; o || *<span class="keyword">this</span> == o;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">////////////////////////////////////////////////////</span></span><br><span class="line">    Bignum&amp; <span class="keyword">operator</span> += (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!sign &amp;&amp; !o.sign)</span><br><span class="line">        &#123;</span><br><span class="line">            us_addto(o);</span><br><span class="line">            sign = <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> (sign &amp;&amp; o.sign)</span><br><span class="line">        &#123;</span><br><span class="line">            us_addto(o);</span><br><span class="line">            sign = <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> (sign &amp;&amp; !o.sign)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (o.us_larger(*<span class="keyword">this</span>))</span><br><span class="line">            &#123;</span><br><span class="line">                Bignum t(o);</span><br><span class="line">                t.us_subto(*<span class="keyword">this</span>);</span><br><span class="line">                *<span class="keyword">this</span> = t;</span><br><span class="line">                sign = <span class="number">0</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                us_subto(o);</span><br><span class="line">                sign = <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">if</span> (bits.size() == <span class="number">1</span> &amp;&amp; bits[<span class="number">0</span>] == <span class="number">0</span>) sign = <span class="number">0</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> (!sign &amp;&amp; o.sign)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (us_larger(o))</span><br><span class="line">            &#123;</span><br><span class="line">                us_subto(o);</span><br><span class="line">                sign = <span class="number">0</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                Bignum t(o);</span><br><span class="line">                t.us_subto(*<span class="keyword">this</span>);</span><br><span class="line">                *<span class="keyword">this</span> = t;</span><br><span class="line">                sign = <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">if</span> (bits.size() == <span class="number">1</span> &amp;&amp; bits[<span class="number">0</span>] == <span class="number">0</span>) sign = <span class="number">0</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Bignum <span class="keyword">operator</span> + (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function">Bignum <span class="title">t</span><span class="params">(*<span class="keyword">this</span>)</span></span>;</span><br><span class="line">        t += o;</span><br><span class="line">        <span class="keyword">return</span> t;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">/////////////////////////////////////////////////</span></span><br><span class="line">    Bignum&amp; <span class="keyword">operator</span>*= (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (length() + o.length() &gt; <span class="number">800</span>) us_multo(o); <span class="comment">//FFT</span></span><br><span class="line">        <span class="keyword">else</span> us_multo_simu(o);                          <span class="comment">//simulate</span></span><br><span class="line">        <span class="keyword">if</span> (sign == o.sign) sign = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">else</span> sign = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Bignum <span class="keyword">operator</span>* (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function">Bignum <span class="title">t</span><span class="params">(*<span class="keyword">this</span>)</span></span>;</span><br><span class="line">        t *= o;</span><br><span class="line">        <span class="keyword">return</span> t;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">////////////////////////////////////////////////</span></span><br><span class="line">    Bignum&amp; <span class="keyword">operator</span>-= (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!sign &amp;&amp; !o.sign)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (us_larger(o))</span><br><span class="line">            &#123;</span><br><span class="line">                us_subto(o);</span><br><span class="line">                sign = <span class="number">0</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                Bignum t(o);</span><br><span class="line">                t.us_subto(*<span class="keyword">this</span>);</span><br><span class="line">                *<span class="keyword">this</span> = t;</span><br><span class="line">                sign = <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">if</span> (bits.size() == <span class="number">1</span> &amp;&amp; bits[<span class="number">0</span>] == <span class="number">0</span>) sign = <span class="number">0</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> (sign &amp;&amp; o.sign)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (us_larger(o))</span><br><span class="line">            &#123;</span><br><span class="line">                us_subto(o);</span><br><span class="line">                sign = <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">if</span> (bits.size() == <span class="number">1</span> &amp;&amp; bits[<span class="number">0</span>] == <span class="number">0</span>) sign = <span class="number">0</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                Bignum t(o);</span><br><span class="line">                t.us_subto(*<span class="keyword">this</span>);</span><br><span class="line">                *<span class="keyword">this</span> = t;</span><br><span class="line">                sign = <span class="number">0</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> (!sign &amp;&amp; o.sign)</span><br><span class="line">        &#123;</span><br><span class="line">            us_addto(o);</span><br><span class="line">            sign = <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> (sign &amp;&amp; !o.sign)</span><br><span class="line">        &#123;</span><br><span class="line">            us_addto(o);</span><br><span class="line">            sign = <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Bignum <span class="keyword">operator</span> - (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function">Bignum <span class="title">t</span><span class="params">(*<span class="keyword">this</span>)</span></span>;</span><br><span class="line">        t -= o;</span><br><span class="line">        <span class="keyword">return</span> t;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">///////////////////////////////////////////////</span></span><br><span class="line">    <span class="function">Bignum&amp; <span class="title">divto2</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (!bits.size()) <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">        bits[<span class="number">0</span>] &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">int</span> i;</span><br><span class="line">        <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt; bits.size(); i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (bits[i] &amp; <span class="number">1</span>) bits[i - <span class="number">1</span>] += <span class="number">5</span>;</span><br><span class="line">            bits[i] &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (bits[i - <span class="number">1</span>] == <span class="number">0</span>) bits.pop_back();</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Bignum&amp; <span class="keyword">operator</span> /= (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        us_divto(o);</span><br><span class="line">        <span class="keyword">if</span> (sign == o.sign) sign = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">else</span> sign = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Bignum <span class="keyword">operator</span> / (Bignum &amp;o)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function">Bignum <span class="title">t</span><span class="params">(*<span class="keyword">this</span>)</span></span>;</span><br><span class="line">        t /= o;</span><br><span class="line">        <span class="keyword">return</span> t;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">//////////////////////////////////////////</span></span><br><span class="line">    <span class="function">Bignum <span class="title">abs</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="function">Bignum <span class="title">t</span><span class="params">(*<span class="keyword">this</span>)</span></span>;</span><br><span class="line">        t.sign = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">return</span> t;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function">Bignum <span class="title">sqrt</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        Bignum L("0"), R(*this);</span><br><span class="line">        <span class="function">Bignum <span class="title">one</span><span class="params">(<span class="string">"1"</span>)</span></span>;</span><br><span class="line">        Bignum m, t;</span><br><span class="line">        <span class="keyword">while</span> (L + one != R)</span><br><span class="line">        &#123;</span><br><span class="line">            m = L + R;</span><br><span class="line">            m.divto2();</span><br><span class="line">            Bignum t = m * m;</span><br><span class="line">            <span class="keyword">if</span> (t == *<span class="keyword">this</span>) <span class="keyword">return</span> m;</span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (t &gt; *<span class="keyword">this</span>) R = m;</span><br><span class="line">            <span class="keyword">else</span> L = m;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> L;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//若e &lt;= 0则会返回1</span></span><br><span class="line">    <span class="comment">//底数（也就是this）是负数的话会根据次数决定符号</span></span><br><span class="line">    <span class="function">Bignum <span class="title">pow</span><span class="params">(Bignum &amp;e)</span> <span class="comment">//a^b == a.pow(b)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (e.sign)<span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">ans</span><span class="params">(<span class="string">"1"</span>)</span></span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">base</span><span class="params">(*<span class="keyword">this</span>)</span></span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">zero</span><span class="params">(<span class="string">"0"</span>)</span></span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">exp</span><span class="params">(e)</span></span>;</span><br><span class="line">        <span class="keyword">while</span> (<span class="built_in">exp</span> &gt; zero)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">exp</span>.bits[<span class="number">0</span>] &amp; <span class="number">1</span>) ans *= base;</span><br><span class="line">            base *= base;</span><br><span class="line">            <span class="built_in">exp</span>.divto2();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (sign &amp;&amp; e.bits[<span class="number">0</span>] &amp; <span class="number">1</span>) ans.sign = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//注意，如果本数小于底数返回1...</span></span><br><span class="line">    <span class="function">Bignum <span class="title">log</span><span class="params">(Bignum &amp;base)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (sign) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">if</span> (length() == <span class="number">1</span> &amp;&amp; bits[<span class="number">0</span>] == <span class="number">1</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">if</span> (*<span class="keyword">this</span> &lt;= base) <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">one</span><span class="params">(<span class="string">"1"</span>)</span></span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">r</span><span class="params">(<span class="string">"1"</span>)</span></span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">c</span><span class="params">(<span class="string">"0"</span>)</span></span>;</span><br><span class="line">        <span class="keyword">while</span> (r &lt; *<span class="keyword">this</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            r *= base;</span><br><span class="line">            c += one;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (r != *<span class="keyword">this</span>) c -= one;</span><br><span class="line">        <span class="keyword">return</span> c;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Bignum <span class="title">lg</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="function">Bignum <span class="title">ten</span><span class="params">(<span class="string">"10"</span>)</span></span>;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">log</span>(ten);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function">Bignum <span class="title">factorial</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="function">Bignum <span class="title">r</span><span class="params">(<span class="string">"1"</span>)</span></span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">zero</span><span class="params">(<span class="string">"0"</span>)</span></span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">one</span><span class="params">(<span class="string">"1"</span>)</span></span>;</span><br><span class="line">        <span class="function">Bignum <span class="title">t</span><span class="params">(*<span class="keyword">this</span>)</span></span>;</span><br><span class="line">        <span class="keyword">while</span> (t &gt; zero)</span><br><span class="line">        &#123;</span><br><span class="line">            r *= t;</span><br><span class="line">            t -= one;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> r;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/////////////////////////////////////////////////////////</span></span><br><span class="line">    <span class="keyword">friend</span> istream&amp; <span class="keyword">operator</span> &gt;&gt; (istream &amp;is, Bignum &amp;b)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">string</span> s;</span><br><span class="line">        is &gt;&gt; s;</span><br><span class="line">        b.mknum(s);</span><br><span class="line">        <span class="keyword">return</span> is;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> ostream&amp; <span class="keyword">operator</span> &lt;&lt; (ostream &amp;os, Bignum b)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (b.sign)os &lt;&lt; <span class="string">'-'</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = b.bits.size() - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) os &lt;&lt; b.bits[i];</span><br><span class="line">        <span class="keyword">return</span> os;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="built_in">string</span> <span class="title">to_string</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> sz = length();</span><br><span class="line">        <span class="built_in">string</span> s;</span><br><span class="line">        <span class="keyword">if</span> (sign) s.resize(sz + <span class="number">1</span>);</span><br><span class="line">        <span class="keyword">else</span> s.resize(sz);</span><br><span class="line">        <span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">if</span> (sign) s[i++] = <span class="string">'-'</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = sz - <span class="number">1</span>; i &lt; sz + sign; i++, j--) s[i] = bits[j] + <span class="string">'0'</span>;</span><br><span class="line">        <span class="keyword">return</span> s;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;;</span><br><span class="line"><span class="comment">////////////////////////////</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> BIGNUM_DEBUG</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> __GNUC__</span></span><br><span class="line">__attribute__((noinline))     <span class="comment">//禁止内联</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> __MINGW32__</span></span><br><span class="line">__attribute__((noinline))</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="function"><span class="keyword">char</span>* <span class="title">printB</span><span class="params">(Bignum &amp;b)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">//仅仅是用于能在gdb中使用它来输出自己</span></span><br><span class="line">    <span class="built_in">string</span> s = b.to_string();</span><br><span class="line">    <span class="keyword">char</span> *buf = (<span class="keyword">char</span> *)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(<span class="keyword">char</span>) * s.length());</span><br><span class="line">    <span class="comment">//这个函数仅用于调试，这里申请的内存不会释放</span></span><br><span class="line">    <span class="comment">//因此非调试时不要使用这个函数</span></span><br><span class="line">    <span class="built_in">strcpy</span>(buf, s.c_str());</span><br><span class="line">    <span class="keyword">return</span> buf;  <span class="comment">//然后gdb中就可以 print printB(一个Bignum )</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    Bignum a;</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; a;</span><br><span class="line">    a = a * a;</span><br><span class="line">    <span class="built_in">cout</span> &lt;&lt; a;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h5 id="自动取模"><a href="#自动取模" class="headerlink" title="自动取模"></a>自动取模</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">long</span> <span class="keyword">long</span> MOD&gt;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">mod_number</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    mod_number() : x(<span class="number">0</span>) &#123;&#125;</span><br><span class="line"></span><br><span class="line">    mod_number(<span class="keyword">long</span> <span class="keyword">long</span> _) &#123; x = (_ % MOD + MOD) % MOD; &#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> x;</span><br><span class="line"></span><br><span class="line">    <span class="function">mod_number <span class="title">pow</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> n)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        mod_number a = *<span class="keyword">this</span>, ans = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (n)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (n &amp; <span class="number">1</span>) ans *= a;</span><br><span class="line">            n &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">            a *= a;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function">mod_number <span class="title">inv</span><span class="params">()</span> </span>&#123; <span class="keyword">return</span> <span class="built_in">pow</span>(MOD - <span class="number">2</span>); &#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    mod_number <span class="keyword">operator</span>+(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> mod_number(x + y.x); &#125;</span><br><span class="line"></span><br><span class="line">    mod_number <span class="keyword">operator</span>-(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> mod_number(x - y.x); &#125;</span><br><span class="line"></span><br><span class="line">    mod_number <span class="keyword">operator</span>*(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> mod_number(x * y.x); &#125;</span><br><span class="line"></span><br><span class="line">    mod_number <span class="keyword">operator</span>/(mod_number y) &#123; <span class="keyword">return</span> mod_number(mod_number(x) * y.inv()); &#125;</span><br><span class="line"></span><br><span class="line">    mod_number &amp;<span class="keyword">operator</span>+=(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> *<span class="keyword">this</span> = *<span class="keyword">this</span> + y; &#125;</span><br><span class="line"></span><br><span class="line">    mod_number &amp;<span class="keyword">operator</span>-=(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> *<span class="keyword">this</span> = *<span class="keyword">this</span> - y; &#125;</span><br><span class="line"></span><br><span class="line">    mod_number &amp;<span class="keyword">operator</span>*=(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> *<span class="keyword">this</span> = *<span class="keyword">this</span> * y; &#125;</span><br><span class="line"></span><br><span class="line">    mod_number &amp;<span class="keyword">operator</span>/=(mod_number y) &#123; <span class="keyword">return</span> *<span class="keyword">this</span> = *<span class="keyword">this</span> / y; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> mod_number <span class="keyword">operator</span>++(<span class="keyword">int</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function">mod_number <span class="title">temp</span><span class="params">(x)</span></span>;</span><br><span class="line">        *<span class="keyword">this</span> += <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">return</span> temp;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> mod_number <span class="keyword">operator</span>--(<span class="keyword">int</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function">mod_number <span class="title">temp</span><span class="params">(x)</span></span>;</span><br><span class="line">        *<span class="keyword">this</span> -= <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">return</span> temp;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    mod_number <span class="keyword">operator</span>++() &#123; <span class="keyword">return</span> *<span class="keyword">this</span> += <span class="number">1</span>; &#125;</span><br><span class="line"></span><br><span class="line">    mod_number <span class="keyword">operator</span>--() &#123; <span class="keyword">return</span> *<span class="keyword">this</span> -= <span class="number">1</span>; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span>&lt;(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> x &lt; y.x; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span>&gt;(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> x &gt; y.x; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span>&lt;=(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> x &lt;= y.x; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span>&gt;=(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> x &gt;= y.x; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span>==(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> x == y.x; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span>!=(<span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> x != y.x; &#125;</span><br><span class="line"></span><br><span class="line">    mod_number <span class="keyword">operator</span>[](<span class="keyword">int</span>) &#123; <span class="keyword">return</span> inv(); &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">friend</span> <span class="built_in">std</span>::ostream &amp;<span class="keyword">operator</span>&lt;&lt;(<span class="built_in">std</span>::ostream &amp;os, <span class="keyword">const</span> mod_number &amp;y) &#123; <span class="keyword">return</span> os &lt;&lt; y.x; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">friend</span> <span class="built_in">std</span>::istream &amp;<span class="keyword">operator</span>&gt;&gt;(<span class="built_in">std</span>::istream &amp;is, mod_number &amp;y)</span><br><span class="line">    &#123;</span><br><span class="line">        is &gt;&gt; y.x;</span><br><span class="line">        <span class="keyword">if</span> (!is) y = mod_number();</span><br><span class="line">        <span class="keyword">else</span> y = mod_number(y.x);</span><br><span class="line">        <span class="keyword">return</span> is;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">//声明</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> IntMaxn = <span class="number">19260817</span>; <span class="comment">//此处为质数</span></span><br><span class="line"><span class="keyword">using</span> Int = ModInt&lt;IntMaxn&gt;;</span><br><span class="line"></span><br><span class="line"><span class="comment">//使用</span></span><br><span class="line"><span class="comment">//for循环请不要用Int做循环变量</span></span><br><span class="line">Int a, b[<span class="number">10</span>];       <span class="comment">//声明数与数组</span></span><br><span class="line"><span class="built_in">cin</span>&gt;&gt;a;             <span class="comment">//输入</span></span><br><span class="line"><span class="built_in">cout</span>&lt;&lt;a;            <span class="comment">//输出</span></span><br><span class="line">Int x=Int(<span class="number">1</span>);       <span class="comment">//类型转换</span></span><br><span class="line">Int(a).<span class="built_in">pow</span>(b.x);    <span class="comment">//快速幂，a的b次方</span></span><br><span class="line">q.inv();            <span class="comment">//q的乘法逆元</span></span><br></pre></td></tr></table></figure><hr><h4 id="求N-的最后一位的非0数"><a href="#求N-的最后一位的非0数" class="headerlink" title="求N!的最后一位的非0数"></a>求N!的最后一位的非0数</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> ff[] = &#123;<span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">6</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">8</span>, <span class="number">4</span>, <span class="number">6</span>&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">fact</span><span class="params">(<span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> i, x;</span><br><span class="line">    <span class="keyword">if</span> (n &lt; <span class="number">5</span>) <span class="keyword">return</span> ff[n];</span><br><span class="line">    x = (ff[n % <span class="number">10</span>] * <span class="number">6</span>) % <span class="number">10</span>;</span><br><span class="line">    <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= (n / <span class="number">5</span>) % <span class="number">4</span>; i++)</span><br><span class="line">        <span class="keyword">if</span> (x == <span class="number">6</span> || x == <span class="number">2</span>) x = (x + <span class="number">10</span>) / <span class="number">2</span>;</span><br><span class="line">        <span class="keyword">else</span> x /= <span class="number">2</span>;</span><br><span class="line">    <span class="keyword">return</span> (fact(n / <span class="number">5</span>) * x) % <span class="number">10</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="星期问题"><a href="#星期问题" class="headerlink" title="星期问题"></a>星期问题</h4><p>基姆拉尔森公式</p><p>$$<br>W = (D + 2M + 3(M + 1) / 5 + Y + Y / 4 - Y / 100 + Y / 400) \mod 7<br>$$</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 已知1752年9月3日是Sunday，并且日期控制在1700年2月28日后</span></span><br><span class="line"><span class="keyword">char</span> name[][<span class="number">15</span>] = &#123;</span><br><span class="line">    <span class="string">"monday"</span>, <span class="string">"tuesday"</span>, <span class="string">"wednesday"</span>, <span class="string">"thursday"</span>, <span class="string">"friday"</span>, <span class="string">"saturday"</span>,</span><br><span class="line">    <span class="string">"sunday"</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> d, m, y, a;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Day: "</span>);</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;d);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Month: "</span>);</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;m);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Year: "</span>);</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;y);</span><br><span class="line">    <span class="comment">// 一二月当做前一年的十三十四月</span></span><br><span class="line">    <span class="keyword">if</span> (m == <span class="number">1</span> || m == <span class="number">2</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        m += <span class="number">12</span>;</span><br><span class="line">        y--;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// 判断是否在1752年9月3日之前</span></span><br><span class="line">    <span class="keyword">if</span> ((y &lt; <span class="number">1752</span>) || (y == <span class="number">1752</span> &amp;&amp; m &lt; <span class="number">9</span>) || (y == <span class="number">1752</span> &amp;&amp; m == <span class="number">9</span> &amp;&amp; d &lt; <span class="number">3</span>))</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 因为日期控制在1700年2月28日后，所以不用考虑整百年是否是闰年</span></span><br><span class="line">        a = (d + <span class="number">2</span> * m + <span class="number">3</span> * (m + <span class="number">1</span>) / <span class="number">5</span> + y + y / <span class="number">4</span> + <span class="number">5</span>) % <span class="number">7</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 这里需要考虑整百年是否是闰年</span></span><br><span class="line">        a = (d + <span class="number">2</span> * m + <span class="number">3</span> * (m + <span class="number">1</span>) / <span class="number">5</span> + y + y / <span class="number">4</span> - y / <span class="number">100</span> + y / <span class="number">400</span>) % <span class="number">7</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"it's a %s\n"</span>, name[a]);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="计算几何"><a href="#计算几何" class="headerlink" title="计算几何"></a>计算几何</h4><h5 id="Pick-公式"><a href="#Pick-公式" class="headerlink" title="Pick 公式"></a>Pick 公式</h5><p>顶点坐标均是整点的简单多边形:</p><p>面积 = 内部格点数 + 边上格点数 / 2 - 1</p><p>S = n + s / 2 - 1</p><p>(其中n表示多边形内部的点数,s表示多边形边界上的点数,S表示多边形的面积)</p><hr><h5 id="已知圆锥表面积S求最大体积V"><a href="#已知圆锥表面积S求最大体积V" class="headerlink" title="已知圆锥表面积S求最大体积V"></a>已知圆锥表面积S求最大体积V</h5><p>$$<br>V = S \times \sqrt{\frac{S}{72\pi}}<br>$$</p><hr><h5 id="常用"><a href="#常用" class="headerlink" title="常用"></a>常用</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Point</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">double</span> x, y;</span><br><span class="line">    Point(<span class="keyword">double</span> x = <span class="number">0</span>, <span class="keyword">double</span> y = <span class="number">0</span>) : x(x), y(y) &#123;&#125;</span><br><span class="line">    Point <span class="keyword">operator</span> + (Point p) &#123; <span class="keyword">return</span> Point(x + p.x, y + p.y); &#125;</span><br><span class="line">    Point <span class="keyword">operator</span> - (Point p) &#123; <span class="keyword">return</span> Point(x - p.x, y - p.y); &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">typedef</span> Point Vector;</span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">getDot</span><span class="params">(Vector a, Vector b)</span> </span>&#123; <span class="keyword">return</span> a.x * b.x + a.y * b.y; &#125;    <span class="comment">// 点积</span></span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">getCross</span><span class="params">(Vector a, Vector b)</span> </span>&#123; <span class="keyword">return</span> a.x * b.y - a.y * b.x; &#125;  <span class="comment">// 叉积</span></span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">getLength</span><span class="params">(Vector a)</span> </span>&#123; <span class="keyword">return</span> <span class="built_in">sqrt</span>(getDot(a, a)); &#125;              <span class="comment">// 模</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 绕原点逆时针旋转角度B（弧度值）</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">transXY</span><span class="params">(Point &amp;p, <span class="keyword">double</span> B)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">double</span> x = p.x, y = p.y;</span><br><span class="line">    p.x = x * <span class="built_in">cos</span>(B) - y * <span class="built_in">sin</span>(B);</span><br><span class="line">    p.y = x * <span class="built_in">sin</span>(B) + y * <span class="built_in">cos</span>(B);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 判断三点共线（整数值）</span></span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">isCollinear</span><span class="params">(<span class="keyword">const</span> Point &amp;d1, <span class="keyword">const</span> Point &amp;d2, <span class="keyword">const</span> Point &amp;d)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> f = <span class="number">1L</span>L * (d.x - d2.x) * (d1.y - d2.y);</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> g = <span class="number">1L</span>L * (d.y - d2.y) * (d1.x - d2.x);</span><br><span class="line">    <span class="keyword">return</span> f == g;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h5 id="凸多边形宽度"><a href="#凸多边形宽度" class="headerlink" title="凸多边形宽度"></a>凸多边形宽度</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//平行切线间的最小距离</span></span><br><span class="line"><span class="comment">//多边形的最小的长度</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> MAXN = <span class="number">115</span>; <span class="comment">//点的数量</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">P</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">int</span> x, y;</span><br><span class="line">    P() &#123;&#125;</span><br><span class="line">    P (<span class="keyword">int</span> _x, <span class="keyword">int</span> _y) &#123; x = _x, y = _y; &#125;</span><br><span class="line">    P <span class="keyword">operator</span> - (P b) &#123; <span class="keyword">return</span> P(x - b.x, y - b.y); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">len</span><span class="params">()</span> </span>&#123; <span class="keyword">return</span> hypot(x, y); &#125;</span><br><span class="line">&#125; a[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">cross</span><span class="params">(P a, P b)</span> </span>&#123; <span class="keyword">return</span> a.x*b.y - a.y*b.x; &#125;</span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">dist</span><span class="params">(P p, P a, P b)</span> </span>&#123; <span class="keyword">return</span> cross(p - a, b - a) / (b - a).len(); &#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">min_len</span><span class="params">(<span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">double</span> ans = <span class="number">1e100</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= n; i++)</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j &lt; i; j++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">double</span> l = <span class="number">1e100</span>, r = <span class="number">-1e100</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">1</span>; k &lt;= n; k++)</span><br><span class="line">            &#123;</span><br><span class="line">                l = min(l, dist(a[k], a[i], a[j]));</span><br><span class="line">                r = max(r, dist(a[k], a[i], a[j]));</span><br><span class="line">            &#125;</span><br><span class="line">            r -= l;</span><br><span class="line">            ans = min(ans, r);</span><br><span class="line">        &#125;</span><br><span class="line">    <span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; n;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= n; i++) <span class="built_in">cin</span>&gt;&gt;a[i].x&gt;&gt;a[i].y;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"%.10f\n"</span>, min_len(n));</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h5 id="凸包-图形-交点-交线-数学-半平面交"><a href="#凸包-图形-交点-交线-数学-半平面交" class="headerlink" title="凸包,图形,交点,交线,数学,半平面交"></a>凸包,图形,交点,交线,数学,半平面交</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;complex&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">typedef</span> pair&lt;<span class="keyword">int</span>,<span class="keyword">int</span>&gt; pii;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">double</span> pi = <span class="number">4</span> * <span class="built_in">atan</span>(<span class="number">1</span>);</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">double</span> eps = <span class="number">1e-10</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">int</span> <span class="title">dcmp</span> <span class="params">(<span class="keyword">double</span> x)</span> </span>&#123; <span class="keyword">if</span> (<span class="built_in">fabs</span>(x) &lt; eps) <span class="keyword">return</span> <span class="number">0</span>; <span class="keyword">else</span> <span class="keyword">return</span> x &lt; <span class="number">0</span> ? <span class="number">-1</span> : <span class="number">1</span>; &#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">double</span> <span class="title">getDistance</span> <span class="params">(<span class="keyword">double</span> x, <span class="keyword">double</span> y)</span> </span>&#123; <span class="keyword">return</span> <span class="built_in">sqrt</span>(x * x + y * y); &#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">double</span> <span class="title">torad</span><span class="params">(<span class="keyword">double</span> deg)</span> </span>&#123; <span class="keyword">return</span> deg / <span class="number">180</span> * pi; &#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Point</span> &#123;</span></span><br><span class="line">    <span class="keyword">double</span> x, y;</span><br><span class="line">    Point (<span class="keyword">double</span> x = <span class="number">0</span>, <span class="keyword">double</span> y = <span class="number">0</span>): x(x), y(y) &#123;&#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">read</span> <span class="params">()</span> </span>&#123; <span class="built_in">scanf</span>(<span class="string">"%lf%lf"</span>, &amp;x, &amp;y); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">write</span> <span class="params">()</span> </span>&#123; <span class="built_in">printf</span>(<span class="string">"%f %f"</span>, x, y); &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> == (<span class="keyword">const</span> Point&amp; u) <span class="keyword">const</span> &#123; <span class="keyword">return</span> dcmp(x - u.x) == <span class="number">0</span> &amp;&amp; dcmp(y - u.y) == <span class="number">0</span>; &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> != (<span class="keyword">const</span> Point&amp; u) <span class="keyword">const</span> &#123; <span class="keyword">return</span> !(*<span class="keyword">this</span> == u); &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> &lt; (<span class="keyword">const</span> Point&amp; u) <span class="keyword">const</span> &#123; <span class="keyword">return</span> dcmp(x - u.x) &lt; <span class="number">0</span> || (dcmp(x-u.x)==<span class="number">0</span> &amp;&amp; dcmp(y-u.y) &lt; <span class="number">0</span>); &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> &gt; (<span class="keyword">const</span> Point&amp; u) <span class="keyword">const</span> &#123; <span class="keyword">return</span> u &lt; *<span class="keyword">this</span>; &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> &lt;= (<span class="keyword">const</span> Point&amp; u) <span class="keyword">const</span> &#123; <span class="keyword">return</span> *<span class="keyword">this</span> &lt; u || *<span class="keyword">this</span> == u; &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> &gt;= (<span class="keyword">const</span> Point&amp; u) <span class="keyword">const</span> &#123; <span class="keyword">return</span> *<span class="keyword">this</span> &gt; u || *<span class="keyword">this</span> == u; &#125;</span><br><span class="line">    Point <span class="keyword">operator</span> + (<span class="keyword">const</span> Point&amp; u) &#123; <span class="keyword">return</span> Point(x + u.x, y + u.y); &#125;</span><br><span class="line">    Point <span class="keyword">operator</span> - (<span class="keyword">const</span> Point&amp; u) &#123; <span class="keyword">return</span> Point(x - u.x, y - u.y); &#125;</span><br><span class="line">    Point <span class="keyword">operator</span> * (<span class="keyword">const</span> <span class="keyword">double</span> u) &#123; <span class="keyword">return</span> Point(x * u, y * u); &#125;</span><br><span class="line">    Point <span class="keyword">operator</span> / (<span class="keyword">const</span> <span class="keyword">double</span> u) &#123; <span class="keyword">return</span> Point(x / u, y / u); &#125;</span><br><span class="line">    <span class="keyword">double</span> <span class="keyword">operator</span> ^ (<span class="keyword">const</span> Point&amp; u) &#123; <span class="keyword">return</span> x*u.y - y*u.x; &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">typedef</span> Point Vector;</span><br><span class="line"><span class="keyword">typedef</span> <span class="built_in">vector</span>&lt;Point&gt; Polygon;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Line</span> &#123;</span></span><br><span class="line">    <span class="keyword">double</span> a, b, c;</span><br><span class="line">    Line (<span class="keyword">double</span> a = <span class="number">0</span>, <span class="keyword">double</span> b = <span class="number">0</span>, <span class="keyword">double</span> c = <span class="number">0</span>): a(a), b(b), c(c) &#123;&#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">DirLine</span> &#123;</span></span><br><span class="line">    Point p;</span><br><span class="line">    Vector v;</span><br><span class="line">    <span class="keyword">double</span> ang;</span><br><span class="line">    DirLine () &#123;&#125;</span><br><span class="line">    DirLine (Point p, Vector v): p(p), v(v) &#123; ang = <span class="built_in">atan2</span>(v.y, v.x); &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> &lt; (<span class="keyword">const</span> DirLine&amp; u) <span class="keyword">const</span> &#123; <span class="keyword">return</span> ang &lt; u.ang; &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Circle</span> &#123;</span></span><br><span class="line">    Point o;</span><br><span class="line">    <span class="keyword">double</span> r;</span><br><span class="line">    Circle () &#123;&#125;</span><br><span class="line">    Circle (Point o, <span class="keyword">double</span> r = <span class="number">0</span>): o(o), r(r) &#123;&#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">read</span> <span class="params">()</span> </span>&#123; o.read(), <span class="built_in">scanf</span>(<span class="string">"%lf"</span>, &amp;r); &#125;</span><br><span class="line">    <span class="function">Point <span class="title">point</span><span class="params">(<span class="keyword">double</span> rad)</span> </span>&#123; <span class="keyword">return</span> Point(o.x + <span class="built_in">cos</span>(rad)*r, o.y + <span class="built_in">sin</span>(rad)*r); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getArea</span> <span class="params">(<span class="keyword">double</span> rad)</span> </span>&#123; <span class="keyword">return</span> rad * r * r / <span class="number">2</span>; &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> Punctual &#123;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getDistance</span> <span class="params">(Point a, Point b)</span> </span>&#123; <span class="keyword">double</span> x=a.x-b.x, y=a.y-b.y; <span class="keyword">return</span> <span class="built_in">sqrt</span>(x*x + y*y); &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> Vectorial &#123;</span><br><span class="line">    <span class="comment">/* 点积: 两向量长度的乘积再乘上它们夹角的余弦, 夹角大于90度时点积为负 */</span></span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getDot</span> <span class="params">(Vector a, Vector b)</span> </span>&#123; <span class="keyword">return</span> a.x * b.x + a.y * b.y; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 叉积: 叉积等于两向量组成的三角形有向面积的两倍, cross(v, w) = -cross(w, v) */</span></span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getCross</span> <span class="params">(Vector a, Vector b)</span> </span>&#123; <span class="keyword">return</span> a.x * b.y - a.y * b.x; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getLength</span> <span class="params">(Vector a)</span> </span>&#123; <span class="keyword">return</span> <span class="built_in">sqrt</span>(getDot(a, a)); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getPLength</span> <span class="params">(Vector a)</span> </span>&#123; <span class="keyword">return</span> getDot(a, a); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getAngle</span> <span class="params">(Vector u)</span> </span>&#123; <span class="keyword">return</span> <span class="built_in">atan2</span>(u.y, u.x); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getAngle</span> <span class="params">(Vector a, Vector b)</span> </span>&#123; <span class="keyword">return</span> <span class="built_in">acos</span>(getDot(a, b) / getLength(a) / getLength(b)); &#125;</span><br><span class="line">    <span class="function">Vector <span class="title">rotate</span> <span class="params">(Vector a, <span class="keyword">double</span> rad)</span> </span>&#123; <span class="keyword">return</span> Vector(a.x*<span class="built_in">cos</span>(rad)-a.y*<span class="built_in">sin</span>(rad), a.x*<span class="built_in">sin</span>(rad)+a.y*<span class="built_in">cos</span>(rad)); &#125;</span><br><span class="line">    <span class="comment">/* 单位法线 */</span></span><br><span class="line">    <span class="function">Vector <span class="title">getNormal</span> <span class="params">(Vector a)</span> </span>&#123; <span class="keyword">double</span> l = getLength(a); <span class="keyword">return</span> Vector(-a.y/l, a.x/l); &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> ComplexVector &#123;</span><br><span class="line">    <span class="keyword">typedef</span> <span class="built_in">complex</span>&lt;<span class="keyword">double</span>&gt; Point;</span><br><span class="line">    <span class="keyword">typedef</span> Point Vector;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getDot</span><span class="params">(Vector a, Vector b)</span> </span>&#123; <span class="keyword">return</span> real(conj(a)*b); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getCross</span><span class="params">(Vector a, Vector b)</span> </span>&#123; <span class="keyword">return</span> imag(conj(a)*b); &#125;</span><br><span class="line">    <span class="function">Vector <span class="title">rotate</span><span class="params">(Vector a, <span class="keyword">double</span> rad)</span> </span>&#123; <span class="keyword">return</span> a*<span class="built_in">exp</span>(Point(<span class="number">0</span>, rad)); &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> Linear &#123;</span><br><span class="line">    <span class="keyword">using</span> <span class="keyword">namespace</span> Vectorial;</span><br><span class="line"></span><br><span class="line">    <span class="function">Line <span class="title">getLine</span> <span class="params">(<span class="keyword">double</span> x1, <span class="keyword">double</span> y1, <span class="keyword">double</span> x2, <span class="keyword">double</span> y2)</span> </span>&#123; <span class="keyword">return</span> Line(y2-y1, x1-x2, y1*x2-x1*y2); &#125;</span><br><span class="line">    <span class="function">Line <span class="title">getLine</span> <span class="params">(<span class="keyword">double</span> a, <span class="keyword">double</span> b, Point u)</span> </span>&#123; <span class="keyword">return</span> Line(a, -b, u.y * b - u.x * a); &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">bool</span> <span class="title">getIntersection</span> <span class="params">(Line p, Line q, Point&amp; o)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">fabs</span>(p.a * q.b - q.a * p.b) &lt; eps)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        o.x = (q.c * p.b - p.c * q.b) / (p.a * q.b - q.a * p.b);</span><br><span class="line">        o.y = (q.c * p.a - p.c * q.a) / (p.b * q.a - q.b * p.a);</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 直线pv和直线qw的交点 */</span></span><br><span class="line">    <span class="function"><span class="keyword">bool</span> <span class="title">getIntersection</span> <span class="params">(Point p, Vector v, Point q, Vector w, Point&amp; o)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (dcmp(getCross(v, w)) == <span class="number">0</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        Vector u = p - q;</span><br><span class="line">        <span class="keyword">double</span> k = getCross(w, u) / getCross(v, w);</span><br><span class="line">        o = p + v * k;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 点p到直线ab的距离 */</span></span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getDistanceToLine</span> <span class="params">(Point p, Point a, Point b)</span> </span>&#123; <span class="keyword">return</span> <span class="built_in">fabs</span>(getCross(b-a, p-a) / getLength(b-a)); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getDistanceToSegment</span> <span class="params">(Point p, Point a, Point b)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (a == b) <span class="keyword">return</span> getLength(p-a);</span><br><span class="line">        Vector v1 = b - a, v2 = p - a, v3 = p - b;</span><br><span class="line">        <span class="keyword">if</span> (dcmp(getDot(v1, v2)) &lt; <span class="number">0</span>) <span class="keyword">return</span> getLength(v2);</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> (dcmp(getDot(v1, v3)) &gt; <span class="number">0</span>) <span class="keyword">return</span> getLength(v3);</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">return</span> <span class="built_in">fabs</span>(getCross(v1, v2) / getLength(v1));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 点p在直线ab上的投影 */</span></span><br><span class="line">    <span class="function">Point <span class="title">getPointToLine</span> <span class="params">(Point p, Point a, Point b)</span> </span>&#123; Vector v = b-a; <span class="keyword">return</span> a+v*(getDot(v, p-a) / getDot(v,v)); &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 判断线段是否存在交点 */</span></span><br><span class="line">    <span class="function"><span class="keyword">bool</span> <span class="title">haveIntersection</span> <span class="params">(Point a1, Point a2, Point b1, Point b2)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">double</span> c1=getCross(a2-a1, b1-a1), c2=getCross(a2-a1, b2-a1), c3=getCross(b2-b1, a1-b1), c4=getCross(b2-b1,a2-b1);</span><br><span class="line">        <span class="keyword">return</span> dcmp(c1)*dcmp(c2) &lt; <span class="number">0</span> &amp;&amp; dcmp(c3)*dcmp(c4) &lt; <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 判断点是否在线段上 */</span></span><br><span class="line">    <span class="function"><span class="keyword">bool</span> <span class="title">onSegment</span> <span class="params">(Point p, Point a, Point b)</span> </span>&#123; <span class="keyword">return</span> dcmp(getCross(a-p, b-p)) == <span class="number">0</span> &amp;&amp; dcmp(getDot(a-p, b-p)) &lt; <span class="number">0</span>; &#125;</span><br><span class="line">    <span class="function"><span class="keyword">bool</span> <span class="title">onLine</span> <span class="params">(Point p, Point a, Point b)</span> </span>&#123; <span class="keyword">return</span> dcmp(getCross(a-p, b-p)) == <span class="number">0</span>&#125;</span><br><span class="line">    <span class="keyword">bool</span> onLeft(DirLine l, Point p) &#123; <span class="keyword">return</span> dcmp(l.v ^ (p-l.p)) &gt;= <span class="number">0</span>; &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> Triangular &#123;</span><br><span class="line">    <span class="keyword">using</span> <span class="keyword">namespace</span> Vectorial;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getAngle</span> <span class="params">(<span class="keyword">double</span> a, <span class="keyword">double</span> b, <span class="keyword">double</span> c)</span> </span>&#123; <span class="keyword">return</span> <span class="built_in">acos</span>((a*a+b*b-c*c) / (<span class="number">2</span>*a*b)); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getArea</span> <span class="params">(<span class="keyword">double</span> a, <span class="keyword">double</span> b, <span class="keyword">double</span> c)</span> </span>&#123; <span class="keyword">double</span> s =(a+b+c)/<span class="number">2</span>; <span class="keyword">return</span> <span class="built_in">sqrt</span>(s*(s-a)*(s-b)*(s-c)); &#125;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getArea</span> <span class="params">(<span class="keyword">double</span> a, <span class="keyword">double</span> h)</span> </span>&#123; <span class="keyword">return</span> a * h / <span class="number">2</span>; &#125;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getArea</span> <span class="params">(Point a, Point b, Point c)</span> </span>&#123; <span class="keyword">return</span> <span class="built_in">fabs</span>(getCross(b - a, c - a)) / <span class="number">2</span>; &#125;</span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getDirArea</span> <span class="params">(Point a, Point b, Point c)</span> </span>&#123; <span class="keyword">return</span> getCross(b - a, c - a) / <span class="number">2</span>; &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> Polygonal &#123;</span><br><span class="line">    <span class="keyword">using</span> <span class="keyword">namespace</span> Vectorial;</span><br><span class="line">    <span class="keyword">using</span> <span class="keyword">namespace</span> Linear;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getArea</span> <span class="params">(Point* p, <span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">double</span> ret = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n<span class="number">-1</span>; i++)</span><br><span class="line">            ret += (p[i]-p[<span class="number">0</span>]) ^ (p[i+<span class="number">1</span>]-p[<span class="number">0</span>]);</span><br><span class="line">        <span class="keyword">return</span> ret/<span class="number">2</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 凸包 */</span></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">getConvexHull</span> <span class="params">(Point* p, <span class="keyword">int</span> n, Point* ch)</span> </span>&#123;</span><br><span class="line">        sort(p, p + n);</span><br><span class="line">        <span class="keyword">int</span> m = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="comment">/* 可共线 */</span></span><br><span class="line">            <span class="comment">//while (m &gt; 1 &amp;&amp; dcmp(getCross(ch[m-1]-ch[m-2], p[i]-ch[m-1])) &lt; 0) m--;</span></span><br><span class="line">            <span class="keyword">while</span> (m &gt; <span class="number">1</span> &amp;&amp; dcmp(getCross(ch[m<span class="number">-1</span>]-ch[m<span class="number">-2</span>], p[i]-ch[m<span class="number">-1</span>])) &lt;= <span class="number">0</span>) m--;</span><br><span class="line">            ch[m++] = p[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">int</span> k = m;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = n<span class="number">-2</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">            <span class="comment">/* 可共线 */</span></span><br><span class="line">            <span class="comment">//while (m &gt; k &amp;&amp; dcmp(getCross(ch[m-1]-ch[m-2], p[i]-ch[m-2])) &lt; 0) m--;</span></span><br><span class="line">            <span class="keyword">while</span> (m &gt; k &amp;&amp; dcmp(getCross(ch[m<span class="number">-1</span>]-ch[m<span class="number">-2</span>], p[i]-ch[m<span class="number">-2</span>])) &lt;= <span class="number">0</span>) m--;</span><br><span class="line">            ch[m++] = p[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (n &gt; <span class="number">1</span>) m--;</span><br><span class="line">        <span class="keyword">return</span> m;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">isPointInPolygon</span> <span class="params">(Point o, Point* p, <span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> wn = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="keyword">int</span> j = (i + <span class="number">1</span>) % n;</span><br><span class="line">            <span class="keyword">if</span> (onSegment(o, p[i], p[j]) || o == p[i]) <span class="keyword">return</span> <span class="number">0</span>; <span class="comment">// 边界上</span></span><br><span class="line">            <span class="keyword">int</span> k = dcmp(getCross(p[j] - p[i], o-p[i]));</span><br><span class="line">            <span class="keyword">int</span> d1 = dcmp(p[i].y - o.y);</span><br><span class="line">            <span class="keyword">int</span> d2 = dcmp(p[j].y - o.y);</span><br><span class="line">            <span class="keyword">if</span> (k &gt; <span class="number">0</span> &amp;&amp; d1 &lt;= <span class="number">0</span> &amp;&amp; d2 &gt; <span class="number">0</span>) wn++;</span><br><span class="line">            <span class="keyword">if</span> (k &lt; <span class="number">0</span> &amp;&amp; d2 &lt;= <span class="number">0</span> &amp;&amp; d1 &gt; <span class="number">0</span>) wn--;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> wn ? <span class="number">-1</span> : <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 旋转卡壳 */</span></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">rotatingCalipers</span><span class="params">(Point *p, <span class="keyword">int</span> n, <span class="built_in">vector</span>&lt;pii&gt;&amp; sol)</span> </span>&#123;</span><br><span class="line">        sol.clear();</span><br><span class="line">        <span class="keyword">int</span> j = <span class="number">1</span>; p[n] = p[<span class="number">0</span>];</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="keyword">while</span> (getCross(p[j+<span class="number">1</span>]-p[i+<span class="number">1</span>], p[i]-p[i+<span class="number">1</span>]) &gt; getCross(p[j]-p[i+<span class="number">1</span>], p[i]-p[i+<span class="number">1</span>]))</span><br><span class="line">                j = (j+<span class="number">1</span>) % n;</span><br><span class="line">            sol.push_back(make_pair(i, j));</span><br><span class="line">            sol.push_back(make_pair(i + <span class="number">1</span>, j + <span class="number">1</span>));</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">rotatingCalipersGetRectangle</span> <span class="params">(Point *p, <span class="keyword">int</span> n, <span class="keyword">double</span>&amp; area, <span class="keyword">double</span>&amp; perimeter)</span> </span>&#123;</span><br><span class="line">        p[n] = p[<span class="number">0</span>];</span><br><span class="line">        <span class="keyword">int</span> l = <span class="number">1</span>, r = <span class="number">1</span>, j = <span class="number">1</span>;</span><br><span class="line">        area = perimeter = <span class="number">1e20</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            Vector v = (p[i+<span class="number">1</span>]-p[i]) / getLength(p[i+<span class="number">1</span>]-p[i]);</span><br><span class="line">            <span class="keyword">while</span> (dcmp(getDot(v, p[r%n]-p[i]) - getDot(v, p[(r+<span class="number">1</span>)%n]-p[i])) &lt; <span class="number">0</span>) r++;</span><br><span class="line">            <span class="keyword">while</span> (j &lt; r || dcmp(getCross(v, p[j%n]-p[i]) - getCross(v,p[(j+<span class="number">1</span>)%n]-p[i])) &lt; <span class="number">0</span>) j++;</span><br><span class="line">            <span class="keyword">while</span> (l &lt; j || dcmp(getDot(v, p[l%n]-p[i]) - getDot(v, p[(l+<span class="number">1</span>)%n]-p[i])) &gt; <span class="number">0</span>) l++;</span><br><span class="line">            <span class="keyword">double</span> w = getDot(v, p[r%n]-p[i])-getDot(v, p[l%n]-p[i]);</span><br><span class="line">            <span class="keyword">double</span> h = getDistanceToLine (p[j%n], p[i], p[i+<span class="number">1</span>]);</span><br><span class="line">            area = min(area, w * h);</span><br><span class="line">            perimeter = min(perimeter, <span class="number">2</span> * w + <span class="number">2</span> * h);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 计算半平面相交可以用增量法，o(n^2)，初始设置4条无穷大的半平面 */</span></span><br><span class="line">    <span class="comment">/* 用有向直线A-&gt;B切割多边形u，返回左侧。可能退化成单点或线段 */</span></span><br><span class="line">    <span class="function">Polygon <span class="title">cutPolygon</span> <span class="params">(Polygon u, Point a, Point b)</span> </span>&#123;</span><br><span class="line">        Polygon ret;</span><br><span class="line">        <span class="keyword">int</span> n = u.size();</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            Point c = u[i], d = u[(i+<span class="number">1</span>)%n];</span><br><span class="line">            <span class="keyword">if</span> (dcmp((b-a)^(c-a)) &gt;= <span class="number">0</span>) ret.push_back(c);</span><br><span class="line">            <span class="keyword">if</span> (dcmp((b-a)^(c-d)) != <span class="number">0</span>) &#123;</span><br><span class="line">                Point t;</span><br><span class="line">                getIntersection(a, b-a, c, d-c, t);</span><br><span class="line">                <span class="keyword">if</span> (onSegment(t, c, d))</span><br><span class="line">                    ret.push_back(t);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ret;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 半平面相交 */</span></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">halfPlaneIntersection</span><span class="params">(DirLine* li, <span class="keyword">int</span> n, Point* poly)</span> </span>&#123;</span><br><span class="line">        sort(li, li + n);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">int</span> first, last;</span><br><span class="line">        Point* p = <span class="keyword">new</span> Point[n];</span><br><span class="line">        DirLine* q = <span class="keyword">new</span> DirLine[n];</span><br><span class="line">        q[first=last=<span class="number">0</span>] = li[<span class="number">0</span>];</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="keyword">while</span> (first &lt; last &amp;&amp; !onLeft(li[i], p[last<span class="number">-1</span>])) last--;</span><br><span class="line">            <span class="keyword">while</span> (first &lt; last &amp;&amp; !onLeft(li[i], p[first])) first++;</span><br><span class="line">            q[++last] = li[i];</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (dcmp(q[last].v ^ q[last<span class="number">-1</span>].v) == <span class="number">0</span>) &#123;</span><br><span class="line">                last--;</span><br><span class="line">                <span class="keyword">if</span> (onLeft(q[last], li[i].p)) q[last] = li[i];</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (first &lt; last)</span><br><span class="line">                getIntersection(q[last<span class="number">-1</span>].p, q[last<span class="number">-1</span>].v, q[last].p, q[last].v, p[last<span class="number">-1</span>]);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> (first &lt; last &amp;&amp; !onLeft(q[first], p[last<span class="number">-1</span>])) last--;</span><br><span class="line">        <span class="keyword">if</span> (last - first &lt;= <span class="number">1</span>) &#123; <span class="keyword">delete</span> [] p; <span class="keyword">delete</span> [] q; <span class="keyword">return</span> <span class="number">0</span>; &#125;</span><br><span class="line">        getIntersection(q[last].p, q[last].v, q[first].p, q[first].v, p[last]);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">int</span> m = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = first; i &lt;= last; i++) poly[m++] = p[i];</span><br><span class="line">        <span class="keyword">delete</span> [] p; <span class="keyword">delete</span> [] q;</span><br><span class="line">        <span class="keyword">return</span> m;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 去除多边形共线点 */</span></span><br><span class="line">    <span class="function">Polygon <span class="title">simplify</span> <span class="params">(<span class="keyword">const</span> Polygon&amp; poly)</span> </span>&#123;</span><br><span class="line">        Polygon ret;</span><br><span class="line">        <span class="keyword">int</span> n = poly.size();</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            Point a = poly[i];</span><br><span class="line">            Point b = poly[(i+<span class="number">1</span>)%n];</span><br><span class="line">            Point c = poly[(i+<span class="number">2</span>)%n];</span><br><span class="line">            <span class="keyword">if</span> (dcmp((b-a)^(c-b)) != <span class="number">0</span> &amp;&amp; (ret.size() == <span class="number">0</span> || b != ret[ret.size()<span class="number">-1</span>]))</span><br><span class="line">                ret.push_back(b);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ret;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> Circular &#123;</span><br><span class="line">    <span class="keyword">using</span> <span class="keyword">namespace</span> Linear;</span><br><span class="line">    <span class="keyword">using</span> <span class="keyword">namespace</span> Vectorial;</span><br><span class="line">    <span class="keyword">using</span> <span class="keyword">namespace</span> Triangular;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 直线和圆的交点 */</span></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">getLineCircleIntersection</span> <span class="params">(Point p, Point q, Circle O, <span class="keyword">double</span>&amp; t1, <span class="keyword">double</span>&amp; t2, <span class="built_in">vector</span>&lt;Point&gt;&amp; sol)</span> </span>&#123;</span><br><span class="line">        Vector v = q - p;</span><br><span class="line">        <span class="comment">/* 使用前需清空sol */</span></span><br><span class="line">        <span class="comment">//sol.clear();</span></span><br><span class="line">        <span class="keyword">double</span> a = v.x, b = p.x - O.o.x, c = v.y, d = p.y - O.o.y;</span><br><span class="line">        <span class="keyword">double</span> e = a*a+c*c, f = <span class="number">2</span>*(a*b+c*d), g = b*b+d*d-O.r*O.r;</span><br><span class="line">        <span class="keyword">double</span> delta = f*f - <span class="number">4</span>*e*g;</span><br><span class="line">        <span class="keyword">if</span> (dcmp(delta) &lt; <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">if</span> (dcmp(delta) == <span class="number">0</span>) &#123;</span><br><span class="line">            t1 = t2 = -f / (<span class="number">2</span> * e);</span><br><span class="line">            sol.push_back(p + v * t1);</span><br><span class="line">            <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        t1 = (-f - <span class="built_in">sqrt</span>(delta)) / (<span class="number">2</span> * e); sol.push_back(p + v * t1);</span><br><span class="line">        t2 = (-f + <span class="built_in">sqrt</span>(delta)) / (<span class="number">2</span> * e); sol.push_back(p + v * t2);</span><br><span class="line">        <span class="keyword">return</span> <span class="number">2</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 圆和圆的交点 */</span></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">getCircleCircleIntersection</span> <span class="params">(Circle o1, Circle o2, <span class="built_in">vector</span>&lt;Point&gt;&amp; sol)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">double</span> d = getLength(o1.o - o2.o);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (dcmp(d) == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (dcmp(o1.r - o2.r) == <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (dcmp(o1.r + o2.r - d) &lt; <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">if</span> (dcmp(<span class="built_in">fabs</span>(o1.r-o2.r) - d) &gt; <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">double</span> a = getAngle(o2.o - o1.o);</span><br><span class="line">        <span class="keyword">double</span> da = <span class="built_in">acos</span>((o1.r*o1.r + d*d - o2.r*o2.r) / (<span class="number">2</span>*o1.r*d));</span><br><span class="line"></span><br><span class="line">        Point p1 = o1.point(a-da), p2 = o1.point(a+da);</span><br><span class="line"></span><br><span class="line">        sol.push_back(p1);</span><br><span class="line">        <span class="keyword">if</span> (p1 == p2) <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">        sol.push_back(p2);</span><br><span class="line">        <span class="keyword">return</span> <span class="number">2</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 过定点作圆的切线 */</span></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">getTangents</span> <span class="params">(Point p, Circle o, Vector* v)</span> </span>&#123;</span><br><span class="line">        Vector u = o.o - p;</span><br><span class="line">        <span class="keyword">double</span> d = getLength(u);</span><br><span class="line">        <span class="keyword">if</span> (d &lt; o.r) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> (dcmp(d - o.r) == <span class="number">0</span>) &#123;</span><br><span class="line">            v[<span class="number">0</span>] = rotate(u, pi / <span class="number">2</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">double</span> ang = <span class="built_in">asin</span>(o.r / d);</span><br><span class="line">            v[<span class="number">0</span>] = rotate(u, -ang);</span><br><span class="line">            v[<span class="number">1</span>] = rotate(u, ang);</span><br><span class="line">            <span class="keyword">return</span> <span class="number">2</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* a[i] 和 b[i] 分别是第i条切线在O1和O2上的切点 */</span></span><br><span class="line">    <span class="comment">/* have some problems */</span></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">getTangents</span> <span class="params">(Circle o1, Circle o2, Point* a, Point* b)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> cnt = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">if</span> (o1.r &lt; o2.r) &#123; swap(o1, o2); swap(a, b); &#125;</span><br><span class="line">        <span class="keyword">double</span> d2 = getLength(o1.o - o2.o); d2 = d2 * d2;</span><br><span class="line">        <span class="keyword">double</span> rdif = o1.r - o2.r, rsum = o1.r + o2.r;</span><br><span class="line">        <span class="keyword">if</span> (d2 &lt; rdif * rdif) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">if</span> (dcmp(d2) == <span class="number">0</span> &amp;&amp; dcmp(o1.r - o2.r) == <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">double</span> base = getAngle(o2.o - o1.o);</span><br><span class="line">        <span class="keyword">if</span> (dcmp(d2 - rdif * rdif) == <span class="number">0</span>) &#123;</span><br><span class="line">            a[cnt] = o1.point(base); b[cnt] = o2.point(base); cnt++;</span><br><span class="line">            <span class="keyword">return</span> cnt;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">double</span> ang = <span class="built_in">acos</span>( rdif / <span class="built_in">sqrt</span>(d2) );</span><br><span class="line">        a[cnt] = o1.point(base+ang); b[cnt] = o2.point(base+ang); cnt++;</span><br><span class="line">        a[cnt] = o1.point(base-ang); b[cnt] = o2.point(base-ang); cnt++;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (dcmp(d2 - rsum * rsum) == <span class="number">0</span>) &#123;</span><br><span class="line">            a[cnt] = o1.point(base); b[cnt] = o2.point(base); cnt++;</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (d2 &gt; rsum * rsum) &#123;</span><br><span class="line">            <span class="keyword">double</span> ang = <span class="built_in">acos</span>( rsum / <span class="built_in">sqrt</span>(d2) );</span><br><span class="line">            a[cnt] = o1.point(base+ang); b[cnt] = o2.point(pi+base+ang); cnt++;</span><br><span class="line">            a[cnt] = o1.point(base-ang); b[cnt] = o2.point(pi+base-ang); cnt++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> cnt;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 三点确定外切圆 */</span></span><br><span class="line">    <span class="function">Circle <span class="title">CircumscribedCircle</span><span class="params">(Point p1, Point p2, Point p3)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">double</span> Bx = p2.x - p1.x, By = p2.y - p1.y;</span><br><span class="line">        <span class="keyword">double</span> Cx = p3.x - p1.x, Cy = p3.y - p1.y;</span><br><span class="line">        <span class="keyword">double</span> D = <span class="number">2</span> * (Bx * Cy - By * Cx);</span><br><span class="line">        <span class="keyword">double</span> cx = (Cy * (Bx * Bx + By * By) - By * (Cx * Cx + Cy * Cy)) / D + p1.x;</span><br><span class="line">        <span class="keyword">double</span> cy = (Bx * (Cx * Cx + Cy * Cy) - Cx * (Bx * Bx + By * By)) / D + p1.y;</span><br><span class="line">        Point p = Point(cx, cy);</span><br><span class="line">        <span class="keyword">return</span> Circle(p, getLength(p1 - p));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 三点确定内切圆 */</span></span><br><span class="line">    <span class="function">Circle <span class="title">InscribedCircle</span><span class="params">(Point p1, Point p2, Point p3)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">double</span> a = getLength(p2 - p3);</span><br><span class="line">        <span class="keyword">double</span> b = getLength(p3 - p1);</span><br><span class="line">        <span class="keyword">double</span> c = getLength(p1 - p2);</span><br><span class="line">        Point p = (p1 * a + p2 * b + p3 * c) / (a + b + c);</span><br><span class="line">        <span class="keyword">return</span> Circle(p, getDistanceToLine(p, p1, p2));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* 三角形一顶点为圆心 */</span></span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getPublicAreaToTriangle</span> <span class="params">(Circle O, Point a, Point b)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (dcmp((a-O.o)^(b-O.o)) == <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">int</span> sig = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">double</span> da = getPLength(O.o-a), db = getPLength(O.o-b);</span><br><span class="line">        <span class="keyword">if</span> (dcmp(da-db) &gt; <span class="number">0</span>) &#123;</span><br><span class="line">            swap(da, db);</span><br><span class="line">            swap(a, b);</span><br><span class="line">            sig = <span class="number">-1</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">double</span> t1, t2;</span><br><span class="line">        <span class="built_in">vector</span>&lt;Point&gt; sol;</span><br><span class="line">        <span class="keyword">int</span> n = getLineCircleIntersection(a, b, O, t1, t2, sol);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (dcmp(da-O.r*O.r) &lt;= <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (dcmp(db-O.r*O.r) &lt;= <span class="number">0</span>)  <span class="keyword">return</span> getDirArea(O.o, a, b) * sig;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">int</span> k = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">if</span> (getPLength(sol[<span class="number">0</span>]-b) &gt; getPLength(sol[<span class="number">1</span>]-b)) k = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">double</span> ret = getArea(O.o, a, sol[k]) + O.getArea(getAngle(sol[k]-O.o, b-O.o));</span><br><span class="line">            <span class="keyword">double</span> tmp = (a-O.o)^(b-O.o);</span><br><span class="line">            <span class="keyword">return</span> ret * sig * dcmp(tmp);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">double</span> d = getDistanceToSegment(O.o, a, b);</span><br><span class="line">        <span class="keyword">if</span> (dcmp(d-O.r) &gt;= <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">double</span> ret = O.getArea(getAngle(a-O.o, b-O.o));</span><br><span class="line">            <span class="keyword">double</span> tmp = (a-O.o)^(b-O.o);</span><br><span class="line">            <span class="keyword">return</span> ret * sig * dcmp(tmp);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="keyword">double</span> k1 = O.r / getLength(a - O.o), k2 = O.r / getLength(b - O.o);</span><br><span class="line">        Point p = O.o + (a - O.o) * k1, q = O.o + (b - O.o) * k2;</span><br><span class="line">        <span class="keyword">double</span> ret1 = O.getArea(getAngle(p-O.o, q-O.o));</span><br><span class="line">        <span class="keyword">double</span> ret2 = O.getArea(getAngle(sol[<span class="number">0</span>]-O.o, sol[<span class="number">1</span>]-O.o)) - getArea(O.o, sol[<span class="number">0</span>], sol[<span class="number">1</span>]);</span><br><span class="line">        <span class="keyword">double</span> ret = (ret1 - ret2), tmp = (a-O.o)^(b-O.o);</span><br><span class="line">        <span class="keyword">return</span> ret * sig * dcmp(tmp);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">double</span> <span class="title">getPublicAreaToPolygon</span> <span class="params">(Circle O, Point* p, <span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (dcmp(O.r) == <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">double</span> area = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="keyword">int</span> u = (i + <span class="number">1</span>) % n;</span><br><span class="line">            area += getPublicAreaToTriangle(O, p[i], p[u]);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">fabs</span>(area);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> Polygonal;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">105</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> N, M;</span><br><span class="line"><span class="keyword">double</span> X[maxn], Y[maxn], PX[maxn], PY[maxn];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">init</span> <span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">double</span> x, y;</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d%d"</span>, &amp;N, &amp;M);</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= N; i++) &#123;</span><br><span class="line">        X[i] = Y[i] = PX[i] = PY[i] = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j &lt;= M; j++) &#123;</span><br><span class="line">            <span class="built_in">scanf</span>(<span class="string">"%lf%lf"</span>, &amp;x, &amp;y);</span><br><span class="line">            X[i] += x, Y[i] += y;</span><br><span class="line">            PX[i] += x*x, PY[i] += y*y;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="二进制"><a href="#二进制" class="headerlink" title="二进制"></a>二进制</h3><h4 id="状态压缩"><a href="#状态压缩" class="headerlink" title="状态压缩"></a>状态压缩</h4><table><thead><tr><th>最低位是第0位</th><th>操作</th></tr></thead><tbody><tr><td>取第k位（非0则为1）</td><td>(n &gt;&gt; k) &amp; 1</td></tr><tr><td>取后k位（同上，0~k-1位）</td><td>n &amp; ((1 &lt;&lt; k) – 1)</td></tr><tr><td>第k位取反</td><td>n ^= (1 &lt;&lt; k)</td></tr><tr><td>第k位变为1</td><td>n |= (1 &lt;&lt; k)</td></tr><tr><td>第k位变为0</td><td>n &amp;= (~(1 &lt;&lt; k))</td></tr></tbody></table><hr><h4 id="lowbit函数"><a href="#lowbit函数" class="headerlink" title="lowbit函数"></a>lowbit函数</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//lowbit(x)是x的二进制表达式中最低位的1所对应的值</span></span><br><span class="line"><span class="comment">//6的二进制是110，所以lowbit(6)的二进制为10，即lowbit(6)=2</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">lowbit</span><span class="params">(<span class="keyword">int</span> x)</span> </span>&#123; <span class="keyword">return</span> x &amp; (-x); &#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">lowbit</span><span class="params">(<span class="keyword">int</span> x)</span> </span>&#123; <span class="keyword">return</span> x &amp; (x ^ (x - <span class="number">1</span>)); &#125;</span><br></pre></td></tr></table></figure><hr><h3 id="动态规划-DP"><a href="#动态规划-DP" class="headerlink" title="动态规划 DP"></a>动态规划 DP</h3><blockquote><p>01背包</p></blockquote><p>$$<br>F[i,v]=max{F[i−1,v],\ F[i−1,v−C_i]+W_i}<br>$$</p><p>从二维降到一维时应逆序进行</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//二维</span></span><br><span class="line"><span class="keyword">for</span> i= <span class="number">1</span> to N</span><br><span class="line">    <span class="keyword">for</span> v=Ci to V </span><br><span class="line">        F[i,v]=max&#123;F[i−<span class="number">1</span>,v],F[i−<span class="number">1</span>,v−Ci]+Wi&#125;</span><br><span class="line"><span class="comment">//一维</span></span><br><span class="line"><span class="keyword">for</span> i=<span class="number">1</span> to N</span><br><span class="line">    <span class="keyword">for</span> j= V to Ci</span><br><span class="line">        F[j]=max&#123;F[j],F[j−Ci]+Wi&#125;</span><br></pre></td></tr></table></figure><blockquote><p>完全背包</p></blockquote><p>01背包的一维顺序版本</p><blockquote><p>多重背包</p></blockquote><p>二进制优化：按照2的幂进行拆分转化为01背包</p><blockquote><p>二维背包</p></blockquote><p>限制条件加一维</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> k=<span class="number">1</span> to K</span><br><span class="line">    <span class="keyword">for</span> v = V to <span class="number">0</span> </span><br><span class="line">        <span class="keyword">for</span> item i in group k</span><br><span class="line">            f[v]=max&#123;F[v],F[v−Ci]+Wi&#125;</span><br></pre></td></tr></table></figure><blockquote><p>依赖背包</p></blockquote><p>选主件，对附件跑01背包，最后对主件跑01背包</p><blockquote><p>区间dp</p></blockquote><p>石子归并</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">F[i][j]=min&#123;F[i][k]+F[k+<span class="number">1</span>][j]&#125;+Sum[i][j]</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;n;i++)<span class="comment">//枚举区间长度</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j+i&lt;=n;j++)<span class="comment">//枚举区间左端点</span></span><br><span class="line">                <span class="keyword">for</span>(<span class="keyword">int</span> k=j;k&lt;j+i;k++)<span class="comment">//枚举中间值k</span></span><br><span class="line">                    DP[j][j+i]=max(DP[j][k]+DP[k+<span class="number">1</span>][j+i]+Sum[i][j])</span><br></pre></td></tr></table></figure><blockquote><p>四边形优化</p></blockquote><p>枚举中间值时枚举一个新数组，更新时更新该数组为新的中间值</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> i=<span class="number">1</span>; i&lt;n; i++)</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> j=<span class="number">2</span>*n-i; j&gt;<span class="number">0</span>; j--)</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> k=s[j][j+i<span class="number">-1</span>]; k&lt;=s[j+<span class="number">1</span>][j+i]; k++)</span><br><span class="line">            <span class="keyword">if</span> (dp[j][k]+dp[k+<span class="number">1</span>][j+i]+sum[j+i]-sum[j<span class="number">-1</span>] &lt;= dp[j][j+i])</span><br><span class="line">            &#123;</span><br><span class="line">                dp[j][j+i]=dp[j][k]+dp[k+<span class="number">1</span>][j+i]+sum[j+i]-sum[j<span class="number">-1</span>];</span><br><span class="line">                s[j][j+i]=k;</span><br><span class="line">            &#125;</span><br></pre></td></tr></table></figure><blockquote><p>状压dp</p></blockquote><p>把储存原始状态时应该用逆状态存放，判断时可以直接用&amp;</p><hr><h3 id="二分"><a href="#二分" class="headerlink" title="二分"></a>二分</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//求在满足条件下最大或最小的值的题目，满足单调性和有序性</span></span><br><span class="line"><span class="comment">//整数while(l&lt;r)，小数一般for500次,具体次数具体分析</span></span><br><span class="line"><span class="comment">//时间复杂度 O(logn)，最后得到的是可行域的闭区间[l,r]</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (r&gt;l)</span><br><span class="line">&#123;</span><br><span class="line">    mid=(l+r+<span class="number">1</span>)/<span class="number">2</span>;                       <span class="comment">//注意是l+r+1</span></span><br><span class="line">    <span class="keyword">if</span>(check(mid)==<span class="literal">true</span>) l=mid;</span><br><span class="line">    <span class="keyword">else</span> r=mid<span class="number">-1</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="三分"><a href="#三分" class="headerlink" title="三分"></a>三分</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 用于单峰函数求极值</span></span><br><span class="line"><span class="comment">// 整数用while(l&lt;=r)，浮点数用for</span></span><br><span class="line"><span class="comment">// 每次选择区间内的两个点，算完一次后去掉距离标准答案的值更远的那个点到原区间的端点的区间</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">f</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">// 求值</span></span><br><span class="line">    <span class="keyword">int</span> ans;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 适用于上凸型函数</span></span><br><span class="line">    <span class="keyword">return</span> ans;</span><br><span class="line">    <span class="comment">// 下凸型函数可以用INF减去f(x)</span></span><br><span class="line">    <span class="comment">// return INF - ans;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">threeDivideInt</span><span class="params">(<span class="keyword">int</span> L, <span class="keyword">int</span> R)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">while</span> (L &lt; R - <span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">auto</span> mid = (L + R) / <span class="number">2</span>;</span><br><span class="line">        <span class="keyword">auto</span> mmid = (mid + R) / <span class="number">2</span>;</span><br><span class="line">        <span class="keyword">if</span> (f(mid) &gt; f(mmid)) R = mmid;</span><br><span class="line">        <span class="keyword">else</span> L = mid;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 返回x</span></span><br><span class="line">    <span class="keyword">return</span> f(L) &gt; f(R) ? L : R;</span><br><span class="line">    <span class="comment">// 上凸型返回f(x)</span></span><br><span class="line">    <span class="comment">// return f(f(L) &gt; f(R) ? L : R);</span></span><br><span class="line">    <span class="comment">// 下凸型返回f(x)</span></span><br><span class="line">    <span class="comment">// return INF - f(f(L) &gt; f(R) ? L : R);</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">threeDivideDouble</span><span class="params">(<span class="keyword">double</span> low, <span class="keyword">double</span> up)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">double</span> m1, m2;</span><br><span class="line">    <span class="keyword">while</span> (up - low &gt;= eps)</span><br><span class="line">    &#123;</span><br><span class="line">        m1 = low + (up - low) / <span class="number">3</span>;</span><br><span class="line">        m2 = up - (up - low) / <span class="number">3</span>;</span><br><span class="line">        <span class="keyword">if</span> (f(m1) &lt;= f(m2)) low = m1;</span><br><span class="line">        <span class="keyword">else</span> up = m2;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> (m1 + m2) / <span class="number">2</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="数据结构"><a href="#数据结构" class="headerlink" title="数据结构"></a>数据结构</h3><h4 id="并查集"><a href="#并查集" class="headerlink" title="并查集"></a>并查集</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 均摊O(1)的查找、合并</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> MAXN = <span class="number">100000</span> + <span class="number">50</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 1下标</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">union_set</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">int</span> par[MAXN];</span><br><span class="line"></span><br><span class="line">    <span class="comment">//递归查询，可能会爆栈</span></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">find_res</span><span class="params">(<span class="keyword">int</span> x)</span> </span>&#123; <span class="keyword">return</span> x == par[x] ? x : par[x] = find_res(par[x]); &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//非递归查询</span></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">find</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">auto</span> root = x;</span><br><span class="line">        <span class="keyword">while</span> (root != par[root]) root = par[root];</span><br><span class="line">        <span class="keyword">while</span> (x != root)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="keyword">auto</span> temp = par[x];</span><br><span class="line">            par[x] = root;</span><br><span class="line">            x = temp;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> root;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    union_set() &#123; <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">1</span>; i &lt; MAXN; i++) par[i] = i; &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//连接，par[a]=b，a的祖先指向b的祖先，b的祖先为共同的root</span></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">link</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123; par[find(x)] = find(y); &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">bool</span> <span class="title">connected</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123; <span class="keyword">return</span> find(x) == find(y); &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 0下标</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">union_set</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; par;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">find_res</span><span class="params">(<span class="keyword">int</span> x)</span> </span>&#123; <span class="keyword">return</span> x == par[x] ? x : par[x] = find_res(par[x]); &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">find</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">auto</span> root = x;</span><br><span class="line">        <span class="keyword">while</span> (root != par[root]) root = par[root];</span><br><span class="line">        <span class="keyword">while</span> (x != root)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="keyword">auto</span> temp = par[x];</span><br><span class="line">            par[x] = root;</span><br><span class="line">            x = temp;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> root;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    union_set(<span class="keyword">const</span> <span class="keyword">int</span> size) : par(size)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; size; i++) par[i] = i;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">link</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123; par[find(x)] = find(y); &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">bool</span> <span class="title">connected</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123; <span class="keyword">return</span> find(x) == find(y); &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><hr><h4 id="单调栈"><a href="#单调栈" class="headerlink" title="单调栈"></a>单调栈</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//用途：O(n)，找到从左/右遍历第一个比它小/大的元素的位置</span></span><br><span class="line"><span class="comment">//一个元素向左遍历的第一个比它小的数的位置就是将它插入单调栈时栈顶元素的值，若栈为空，则说明不存在这么一个数。然后将此元素的下标存入栈，就能类似迭代般地求解后面的元素</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//对于a[i],l[i]表示 第i个数向左遍历的第一个比它小的元素的位置，0表示无</span></span><br><span class="line"><span class="keyword">int</span> a[<span class="number">10</span>], l[<span class="number">10</span>], n;</span><br><span class="line"><span class="built_in">stack</span> &lt;<span class="keyword">int</span>&gt; S;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= n; i++)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">while</span> (S.size() &amp;&amp; a[S.top()] &gt;= a[i]) S.pop();</span><br><span class="line">    <span class="keyword">if</span> (S.empty()) l[i] = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">else</span> l[i] = S.top();</span><br><span class="line">    S.push(i);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="区间最值查询-RMQ"><a href="#区间最值查询-RMQ" class="headerlink" title="区间最值查询 RMQ"></a>区间最值查询 RMQ</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//用于离线区间查询最大值和最小值</span></span><br><span class="line"><span class="comment">//ST表实现</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">int</span> MAXN = <span class="number">50000</span> + <span class="number">100</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">int</span> LOGMAXN = (<span class="keyword">int</span>)(log2(MAXN)) + <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> n;</span><br><span class="line"><span class="keyword">int</span> d[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="keyword">int</span> dlog[MAXN] = &#123; <span class="number">0</span> &#125;; <span class="comment">//log表</span></span><br><span class="line"><span class="keyword">int</span> dmax[MAXN][LOGMAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="keyword">int</span> dmin[MAXN][LOGMAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">//预处理，O(nlogn)</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">init</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        dmin[i][<span class="number">0</span>] = d[i];</span><br><span class="line">        dmax[i][<span class="number">0</span>] = d[i];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; (<span class="number">1</span> &lt;&lt; j) &lt;= n; j++)</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i + (<span class="number">1</span> &lt;&lt; j) - <span class="number">1</span> &lt;= n; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            dmin[i][j] = min(dmin[i][j - <span class="number">1</span>], dmin[i + (<span class="number">1</span> &lt;&lt; (j - <span class="number">1</span>))][j - <span class="number">1</span>]);</span><br><span class="line">            dmax[i][j] = max(dmax[i][j - <span class="number">1</span>], dmax[i + (<span class="number">1</span> &lt;&lt; (j - <span class="number">1</span>))][j - <span class="number">1</span>]);</span><br><span class="line">        &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i &lt;= MAXN - <span class="number">100</span>; i++) dlog[i] = dlog[i &gt;&gt; <span class="number">1</span>] + <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 数组0下标！！！</span></span><br><span class="line"><span class="comment">// 注意题目是否是0下标，否则查询的时候应减一后传入函数</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">int</span> MAXN = <span class="number">50000</span> + <span class="number">100</span>;</span><br><span class="line"><span class="keyword">int</span> nums[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">TStTable</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">int</span> LOGMAXN = (<span class="keyword">int</span>)(log2(MAXN)) + <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> stmin[MAXN][LOGMAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">    <span class="keyword">int</span> stmax[MAXN][LOGMAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line">    <span class="keyword">int</span> XLog[LOGMAXN] = &#123; <span class="number">0</span> &#125;; <span class="comment">//log表</span></span><br><span class="line"></span><br><span class="line">    TStTable()</span><br><span class="line">    &#123;</span><br><span class="line">        XLog[<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i &lt; LOGMAXN; i++) XLog[i] = XLog[i &gt;&gt; <span class="number">1</span>] + <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//预处理，O(nlogn)，传入数组和数字数量</span></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">InitSt</span><span class="params">(<span class="keyword">int</span> *nums, <span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            stmin[i][<span class="number">0</span>] = nums[i];</span><br><span class="line">            stmax[i][<span class="number">0</span>] = nums[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; (<span class="number">1</span> &lt;&lt; j) &lt;= n; j++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i + (<span class="number">1</span> &lt;&lt; j) - <span class="number">1</span> &lt; n; i++)</span><br><span class="line">            &#123;</span><br><span class="line">                stmin[i][j] = min(stmin[i][j - <span class="number">1</span>], stmin[i + (<span class="number">1</span> &lt;&lt; (j - <span class="number">1</span>))][j - <span class="number">1</span>]);</span><br><span class="line">                stmax[i][j] = max(stmax[i][j - <span class="number">1</span>], stmax[i + (<span class="number">1</span> &lt;&lt; (j - <span class="number">1</span>))][j - <span class="number">1</span>]);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//查询最大值，O(1)，常数较小</span></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">getmax</span><span class="params">(<span class="keyword">int</span> L, <span class="keyword">int</span> R)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> x = XLog[R - L + <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">return</span> max(stmax[L][x], stmax[R - (<span class="number">1</span> &lt;&lt; x) + <span class="number">1</span>][x]);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//查询最小值，O(1)，常数较小</span></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">getmin</span><span class="params">(<span class="keyword">int</span> L, <span class="keyword">int</span> R)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> x = XLog[R - L + <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">return</span> min(stmin[L][x], stmin[R - (<span class="number">1</span> &lt;&lt; x) + <span class="number">1</span>][x]);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//查询最大最小值之差，O(1)，常数较小</span></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">getdelta</span><span class="params">(<span class="keyword">int</span> L, <span class="keyword">int</span> R)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> x = XLog[R - L + <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">return</span> max(stmax[L][x], stmax[R - (<span class="number">1</span> &lt;&lt; x) + <span class="number">1</span>][x]) - min(stmin[L][x], stmin[R - (<span class="number">1</span> &lt;&lt; x) + <span class="number">1</span>][x]);</span><br><span class="line">    &#125;</span><br><span class="line">&#125; stTable;</span><br></pre></td></tr></table></figure><hr><h3 id="字符串"><a href="#字符串" class="headerlink" title="字符串"></a>字符串</h3><h4 id="最长回文串"><a href="#最长回文串" class="headerlink" title="最长回文串"></a>最长回文串</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//Manacher算法</span></span><br><span class="line"><span class="comment">//可进行回文串及信息输出</span></span><br><span class="line"><span class="comment">//返回值为长度</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Manacher</span><span class="params">(<span class="built_in">string</span> &amp;s)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">string</span> s1 = <span class="string">"$#"</span>;</span><br><span class="line">    <span class="keyword">int</span> len0 = s.size();</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len0; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        s1 += s[i];</span><br><span class="line">        s1 += <span class="string">"#"</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> mx = <span class="number">0</span>;                <span class="comment">//最大右边界</span></span><br><span class="line">    <span class="keyword">int</span> pos;                <span class="comment">//最大回文串的对称轴</span></span><br><span class="line">    <span class="keyword">int</span> len = s1.size();</span><br><span class="line">    <span class="function"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; <span class="title">p</span><span class="params">(len)</span></span>;        <span class="comment">//回文最长半径数组 p[i]=k 代表在位置i的回文串的最长半径为k</span></span><br><span class="line">    <span class="keyword">int</span> res = <span class="number">-1</span>;            <span class="comment">//最大长度</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; len; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (mx &gt; i) p[i] = min(p[<span class="number">2</span> * pos - i], mx - i); <span class="comment">//i在mx左边</span></span><br><span class="line">        <span class="keyword">else</span> p[i] = <span class="number">1</span>;                                    <span class="comment">//i在mx右边，必须一个个匹配</span></span><br><span class="line">        <span class="keyword">while</span> (s1[i - p[i]] == s1[i + p[i]]) p[i]++;</span><br><span class="line">        <span class="keyword">if</span> (i + p[i] &gt; mx)                                <span class="comment">//更新maxright 最大回文串对称轴位置</span></span><br><span class="line">        &#123;</span><br><span class="line">            pos = i;</span><br><span class="line">            mx = pos + p[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (p[i] - <span class="number">1</span> &gt; res) res = p[i] - <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//字符串输出</span></span><br><span class="line">    <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; ans;</span><br><span class="line">    <span class="built_in">cout</span> &lt;&lt; <span class="string">"len = "</span> &lt;&lt; res &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; len; i++)</span><br><span class="line">        <span class="keyword">if</span> (p[i] - <span class="number">1</span> == res) ans.push_back((i / <span class="number">2</span>) - ((res + <span class="number">1</span>) / <span class="number">2</span>));</span><br><span class="line">    <span class="built_in">cout</span> &lt;&lt; <span class="string">"num = "</span> &lt;&lt; ans.size() &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> it : ans)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">cout</span> &lt;&lt; <span class="string">"first char on: "</span> &lt;&lt; it &lt;&lt; <span class="string">" string-&gt;"</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = it; j &lt; it + res; j++) <span class="built_in">cout</span> &lt;&lt; s[j];</span><br><span class="line">        <span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> res;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="Hash处理"><a href="#Hash处理" class="headerlink" title="Hash处理"></a>Hash处理</h4><h5 id="全字符集"><a href="#全字符集" class="headerlink" title="全字符集"></a>全字符集</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//ASCII全字符集，通用版，不一定完全适用</span></span><br><span class="line"><span class="comment">//BASE1和BASE2应当设置为出现的字符种类数加1及以上</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> MAXN = <span class="number">100010</span>; <span class="comment">//字符串长度</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> BASE1 = <span class="number">257</span>; <span class="comment">//进制</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> MOD1 = <span class="number">32031528556843483</span>;</span><br><span class="line"><span class="comment">//MOD数，用这个数的话单hash能过，双hash可以考虑改小这个数</span></span><br><span class="line"><span class="comment">//MOD数要么小于MAX_INT,要么在计算过程用快速乘</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> p1[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> Hash_1[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Hash_1_cal</span><span class="params">(<span class="built_in">string</span> s)</span> <span class="comment">//求s的整个字符串的hash</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    p1[<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= MAXN - <span class="number">10</span>; i++) p1[i] = (p1[i - <span class="number">1</span>] * BASE1) % MOD1;</span><br><span class="line">    Hash_1[<span class="number">0</span>] = (<span class="keyword">long</span> <span class="keyword">long</span>)s[<span class="number">0</span>] % MOD1;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; s.length(); i++)</span><br><span class="line">        Hash_1[i] = (Hash_1[i - <span class="number">1</span>] * BASE1 + (<span class="keyword">long</span> <span class="keyword">long</span>)s[i]) % MOD1;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">get_H1</span><span class="params">(<span class="keyword">int</span> l, <span class="keyword">int</span> r)</span> <span class="comment">//求从子串[l,r]的哈希值</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> (Hash_1[r] - (l == <span class="number">0</span> ? <span class="number">0</span> : Hash_1[l - <span class="number">1</span>]) * p1[r - l + <span class="number">1</span>] % MOD1 + MOD1) % MOD1;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//双hash</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> BASE2 = <span class="number">233</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> MOD2 = <span class="number">19260817</span>;</span><br><span class="line"><span class="comment">//MOD数要么小于MAX_INT,要么在计算过程用快速乘</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> p2[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> Hash_2[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Hash_2_cal</span><span class="params">(<span class="built_in">string</span> s)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    p2[<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= MAXN - <span class="number">10</span>; i++) p2[i] = (p2[i - <span class="number">1</span>] * BASE2) % MOD2;</span><br><span class="line">    Hash_2[<span class="number">0</span>] = (<span class="keyword">long</span> <span class="keyword">long</span>)s[<span class="number">0</span>] % MOD2;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; s.length(); i++)</span><br><span class="line">        Hash_2[i] = (Hash_2[i - <span class="number">1</span>] * BASE2 + (<span class="keyword">long</span> <span class="keyword">long</span>)s[i]) % MOD2;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">get_H2</span><span class="params">(<span class="keyword">int</span> l, <span class="keyword">int</span> r)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> (Hash_2[r] - (l == <span class="number">0</span> ? <span class="number">0</span> : Hash_2[l - <span class="number">1</span>]) * p2[r - l + <span class="number">1</span>] % MOD2 + MOD2) % MOD2;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h5 id="小写字母集"><a href="#小写字母集" class="headerlink" title="小写字母集"></a>小写字母集</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> MAXN = <span class="number">1700</span>; <span class="comment">//字符串长度</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> BASE1 = <span class="number">29</span>; <span class="comment">//进制</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> MOD1 = <span class="number">1e9</span> + <span class="number">9</span>; <span class="comment">//MOD数</span></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> p1[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> Hash_1[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Hash_1_cal</span><span class="params">(<span class="built_in">string</span> s)</span> <span class="comment">//求s的整个字符串的hash</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    p1[<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= MAXN - <span class="number">10</span>; i++) p1[i] = (p1[i - <span class="number">1</span>] * BASE1) % MOD1;</span><br><span class="line">    Hash_1[<span class="number">0</span>] = (<span class="keyword">long</span> <span class="keyword">long</span>)(s[<span class="number">0</span>] - <span class="string">'a'</span> + <span class="number">1</span>) % MOD1;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; s.length(); i++)</span><br><span class="line">        Hash_1[i] = (Hash_1[i - <span class="number">1</span>] * BASE1 + (<span class="keyword">long</span> <span class="keyword">long</span>)(s[i] - <span class="string">'a'</span> + <span class="number">1</span>)) % MOD1;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">get_H1</span><span class="params">(<span class="keyword">int</span> l, <span class="keyword">int</span> r)</span> <span class="comment">//求从子串[l,r]的哈希值</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> (Hash_1[r] - (l == <span class="number">0</span> ? <span class="number">0</span> : Hash_1[l - <span class="number">1</span>]) * p1[r - l + <span class="number">1</span>] % MOD1 + MOD1) % MOD1;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//双hash</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> BASE2 = <span class="number">31</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> MOD2 = <span class="number">1e9</span> + <span class="number">7</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> p2[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> Hash_2[MAXN] = &#123; <span class="number">0</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Hash_2_cal</span><span class="params">(<span class="built_in">string</span> s)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    p2[<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= MAXN - <span class="number">10</span>; i++) p2[i] = (p2[i - <span class="number">1</span>] * BASE2) % MOD2;</span><br><span class="line">    Hash_2[<span class="number">0</span>] = (<span class="keyword">long</span> <span class="keyword">long</span>)(s[<span class="number">0</span>] - <span class="string">'a'</span> + <span class="number">1</span>) % MOD2;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; s.length(); i++)</span><br><span class="line">        Hash_2[i] = (Hash_2[i - <span class="number">1</span>] * BASE2 + (<span class="keyword">long</span> <span class="keyword">long</span>)(s[i] - <span class="string">'a'</span> + <span class="number">1</span>)) % MOD2;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">get_H2</span><span class="params">(<span class="keyword">int</span> l, <span class="keyword">int</span> r)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> (Hash_2[r] - (l == <span class="number">0</span> ? <span class="number">0</span> : Hash_2[l - <span class="number">1</span>]) * p2[r - l + <span class="number">1</span>] % MOD2 + MOD2) % MOD2;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="字符串匹配"><a href="#字符串匹配" class="headerlink" title="字符串匹配"></a>字符串匹配</h4><h5 id="KMP"><a href="#KMP" class="headerlink" title="KMP"></a>KMP</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> MAXN = <span class="number">1000</span>;</span><br><span class="line"><span class="built_in">string</span> s, a; <span class="comment">//在s中找a</span></span><br><span class="line"><span class="keyword">int</span> ans[MAXN] = &#123;<span class="number">0</span>&#125;;</span><br><span class="line"><span class="keyword">int</span> f[MAXN], slen, alen;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">getFail</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> i = <span class="number">0</span>, j = <span class="number">-1</span>;</span><br><span class="line">    f[<span class="number">0</span>] = <span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">while</span> (i &lt; alen)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (j == <span class="number">-1</span> || a[i] == a[j])</span><br><span class="line">        &#123;</span><br><span class="line">            i++;</span><br><span class="line">            j++;</span><br><span class="line">            f[i] = j;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> j = f[j];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">KMP</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">memset</span>(f,<span class="number">0</span>,<span class="keyword">sizeof</span>(f));</span><br><span class="line">    <span class="built_in">memset</span>(ans,<span class="number">0</span>,<span class="keyword">sizeof</span>(ans));</span><br><span class="line">    <span class="keyword">int</span> i = <span class="number">0</span>, j = <span class="number">0</span>, temp = <span class="number">1</span>;</span><br><span class="line">    slen = s.length();</span><br><span class="line">    alen = a.length();</span><br><span class="line">    getFail();</span><br><span class="line">    <span class="keyword">while</span> (i &lt; slen)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (j == <span class="number">-1</span> || s[i] == a[j])</span><br><span class="line">        &#123;</span><br><span class="line">            i++;</span><br><span class="line">            j++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> j = f[j];</span><br><span class="line">        <span class="keyword">if</span> (j == alen)</span><br><span class="line">        &#123;</span><br><span class="line">            ans[temp] = i - alen;</span><br><span class="line">            temp++;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> temp - <span class="number">1</span>; <span class="comment">//成功个数</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; s &gt;&gt; a;</span><br><span class="line">    <span class="keyword">int</span> ansnum = KMP();</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h5 id="扩展KMP"><a href="#扩展KMP" class="headerlink" title="扩展KMP"></a>扩展KMP</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">* 扩展KMP</span></span><br><span class="line"><span class="comment">* next[i]:x[i...m-1]的最长公共前缀</span></span><br><span class="line"><span class="comment">* extend[i]:y[i...n-1]与x[0...m-1]的最长公共前缀</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">preEKMP</span><span class="params">(<span class="keyword">char</span> x[], <span class="keyword">int</span> m, <span class="keyword">int</span> next[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    next[<span class="number">0</span>] = m;</span><br><span class="line">    <span class="keyword">int</span> j = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (j + <span class="number">1</span> &lt; m &amp;&amp; x[j] == x[j + <span class="number">1</span>]) j++;</span><br><span class="line">    next[<span class="number">1</span>] = j;</span><br><span class="line">    <span class="keyword">int</span> k = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i &lt; m; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> p = next[k] + k - <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">int</span> L = next[i - k];</span><br><span class="line">        <span class="keyword">if</span> (i + L &lt; p + <span class="number">1</span>) next[i] = L;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">            j = <span class="built_in">std</span>::max(<span class="number">0</span>, p - i + <span class="number">1</span>);</span><br><span class="line">            <span class="keyword">while</span> (i + j &lt; m &amp;&amp; x[i + j] == x[j]) j++;</span><br><span class="line">            next[i] = j;</span><br><span class="line">            k = i;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">EKMP</span><span class="params">(<span class="keyword">char</span> x[], <span class="keyword">int</span> m, <span class="keyword">char</span> y[], <span class="keyword">int</span> n, <span class="keyword">int</span> next[], <span class="keyword">int</span> extend[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    preEKMP(x, m, next);</span><br><span class="line">    <span class="keyword">int</span> j = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (j &lt; n &amp;&amp; j &lt; m &amp;&amp; x[j] == y[j]) j++;</span><br><span class="line">    extend[<span class="number">0</span>] = j;</span><br><span class="line">    <span class="keyword">int</span> k = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> p = extend[k] + k - <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">int</span> L = next[i - k];</span><br><span class="line">        <span class="keyword">if</span> (i + L &lt; p + <span class="number">1</span>) extend[i] = L;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">            j = <span class="built_in">std</span>::max(<span class="number">0</span>, p - i + <span class="number">1</span>);</span><br><span class="line">            <span class="keyword">while</span> (i + j &lt; n &amp;&amp; j &lt; m &amp;&amp; y[i + j] == x[j]) j++;</span><br><span class="line">            extend[i] = j;</span><br><span class="line">            k = i;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h5 id="AC自动机"><a href="#AC自动机" class="headerlink" title="AC自动机"></a>AC自动机</h5><h6 id="快速版"><a href="#快速版" class="headerlink" title="快速版"></a>快速版</h6><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//适用于小写字母</span></span><br><span class="line"><span class="comment">//统计单词出现次数或者个数</span></span><br><span class="line"><span class="comment">//较快</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Aho_Corasick_Automaton</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="meta">#<span class="meta-keyword">define</span> N 500010 <span class="comment">//单词的长度*单词个数</span></span></span><br><span class="line">    <span class="built_in">queue</span>&lt;<span class="keyword">int</span>&gt; q;</span><br><span class="line">    <span class="keyword">int</span> c[N][<span class="number">26</span>],val[N],fail[N],cnt=<span class="number">0</span>;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">init</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="built_in">memset</span>(c,<span class="number">0</span>,<span class="keyword">sizeof</span>(c));</span><br><span class="line">        <span class="built_in">memset</span>(val,<span class="number">0</span>,<span class="keyword">sizeof</span>(val));</span><br><span class="line">        <span class="built_in">memset</span>(fail,<span class="number">0</span>,<span class="keyword">sizeof</span>(fail));</span><br><span class="line">        cnt=<span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">ins</span><span class="params">(<span class="keyword">char</span> *s)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> len=<span class="built_in">strlen</span>(s);</span><br><span class="line">        <span class="keyword">int</span> now=<span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i=<span class="number">0</span>; i&lt;len; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">int</span> v=s[i]-<span class="string">'a'</span>; </span><br><span class="line">            <span class="keyword">if</span> (!c[now][v])c[now][v]=++cnt;</span><br><span class="line">            now=c[now][v];</span><br><span class="line">        &#125;</span><br><span class="line">        val[now]++;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">build</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i=<span class="number">0</span>; i&lt;<span class="number">26</span>; i++)</span><br><span class="line">            <span class="keyword">if</span> (c[<span class="number">0</span>][i]) fail[c[<span class="number">0</span>][i]]=<span class="number">0</span>,q.push(c[<span class="number">0</span>][i]);</span><br><span class="line">        <span class="keyword">while</span> (!q.empty())</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">int</span> u=q.front();</span><br><span class="line">            q.pop();</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> i=<span class="number">0</span>; i&lt;<span class="number">26</span>; i++)</span><br><span class="line">                <span class="keyword">if</span> (c[u][i]) fail[c[u][i]]=c[fail[u]][i],q.push(c[u][i]);</span><br><span class="line">                <span class="keyword">else</span> c[u][i]=c[fail[u]][i];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">query</span><span class="params">(<span class="keyword">char</span> *s)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> len=<span class="built_in">strlen</span>(s);</span><br><span class="line">        <span class="keyword">int</span> now=<span class="number">0</span>,ans=<span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i=<span class="number">0</span>; i&lt;len; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            now=c[now][s[i]-<span class="string">'a'</span>];</span><br><span class="line">            <span class="comment">//每个单词出现次数最多为1</span></span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> t=now; t&amp;&amp;~val[t]; t=fail[t]) ans+=val[t],val[t]=<span class="number">-1</span>;</span><br><span class="line">            <span class="comment">//每个单词出现次数最多为不限</span></span><br><span class="line">            <span class="comment">//for (int t=now; t; t=fail[t]) ans+=val[t];</span></span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line">    &#125;</span><br><span class="line">&#125; AC;</span><br><span class="line"><span class="keyword">char</span> p[<span class="number">1000005</span>]; <span class="comment">//缓冲区</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">AUTO</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> T;</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line">    <span class="keyword">while</span> (T--)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> n;</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);</span><br><span class="line">        AC.init();</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i=<span class="number">1</span>; i&lt;=n; i++) <span class="built_in">scanf</span>(<span class="string">"%s"</span>,p),AC.ins(p);</span><br><span class="line">        AC.build();</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">"%s"</span>,p);</span><br><span class="line">        <span class="keyword">int</span> ans=AC.query(p);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"%d\n"</span>,ans);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h6 id="完整版"><a href="#完整版" class="headerlink" title="完整版"></a>完整版</h6><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//适用字符多</span></span><br><span class="line"><span class="comment">//答案详见输出</span></span><br><span class="line"><span class="comment">//较慢</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Aho_Corasick</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">int</span> TEXTNUM = <span class="number">500</span> + <span class="number">50</span>; <span class="comment">//单词数量</span></span><br><span class="line">    <span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">int</span> TEXTLEN = <span class="number">250</span>; <span class="comment">//单词长度</span></span><br><span class="line">    <span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">int</span> maxnode = TEXTNUM * TEXTLEN; <span class="comment">//节点数</span></span><br><span class="line">    <span class="keyword">const</span> <span class="keyword">static</span> <span class="keyword">int</span> type = <span class="number">128</span>; <span class="comment">//单词字符数</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">char</span> str[TEXTNUM * TEXTLEN * <span class="number">100</span>]; <span class="comment">//缓冲区</span></span><br><span class="line">    <span class="keyword">char</span> ss[TEXTNUM][TEXTLEN]; <span class="comment">//单词</span></span><br><span class="line">    <span class="keyword">int</span> num[TEXTNUM]; <span class="comment">//单词出现次数</span></span><br><span class="line">    <span class="keyword">int</span> next[maxnode][type], fail[maxnode], end[maxnode];</span><br><span class="line">    <span class="keyword">int</span> root, L;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">newnode</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; type; i++) next[L][i] = <span class="number">-1</span>;</span><br><span class="line">        end[L++] = <span class="number">-1</span>;</span><br><span class="line">        <span class="keyword">return</span> L - <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">init</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        L = <span class="number">0</span>;</span><br><span class="line">        root = newnode();</span><br><span class="line">        <span class="built_in">memset</span>(str, <span class="number">0</span>, <span class="keyword">sizeof</span>(str));</span><br><span class="line">        <span class="built_in">memset</span>(ss, <span class="number">0</span>, <span class="keyword">sizeof</span>(ss));</span><br><span class="line">        <span class="built_in">memset</span>(num, <span class="number">0</span>, <span class="keyword">sizeof</span>(num));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">insert</span><span class="params">(<span class="keyword">char</span>* str, <span class="keyword">int</span> idx)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">auto</span> len = <span class="built_in">strlen</span>(str);</span><br><span class="line">        <span class="keyword">int</span> now = root;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; len; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">int</span> id = str[i];</span><br><span class="line">            <span class="keyword">if</span> (next[now][id] == <span class="number">-1</span>) next[now][id] = newnode();</span><br><span class="line">            now = next[now][id];</span><br><span class="line">        &#125;</span><br><span class="line">        end[now] = idx;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">build</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="built_in">queue</span>&lt;<span class="keyword">int</span>&gt; Q;</span><br><span class="line">        fail[root] = root;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; <span class="number">128</span>; i++)</span><br><span class="line">            <span class="keyword">if</span> (next[root][i] == <span class="number">-1</span>) next[root][i] = root;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                fail[next[root][i]] = root;</span><br><span class="line">                Q.push(next[root][i]);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> (!Q.empty())</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">auto</span> now = Q.front();</span><br><span class="line">            Q.pop();</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; type; i++)</span><br><span class="line">                <span class="keyword">if</span> (next[now][i] == <span class="number">-1</span>) next[now][i] = next[fail[now]][i];</span><br><span class="line">                <span class="keyword">else</span></span><br><span class="line">                &#123;</span><br><span class="line">                    fail[next[now][i]] = next[fail[now]][i];</span><br><span class="line">                    Q.push(next[now][i]);</span><br><span class="line">                &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">query</span><span class="params">(<span class="keyword">char</span>* str, <span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">auto</span> len = <span class="built_in">strlen</span>(str);</span><br><span class="line">        <span class="keyword">int</span> now = root;</span><br><span class="line">        <span class="built_in">memset</span>(num, <span class="number">0</span>, <span class="keyword">sizeof</span>(num));</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; len; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">int</span> id = str[i];</span><br><span class="line">            now = next[now][id];</span><br><span class="line">            <span class="keyword">int</span> temp = now;</span><br><span class="line">            <span class="keyword">while</span> (temp != root)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (end[temp] != <span class="number">-1</span>) num[end[temp]]++;</span><br><span class="line">                temp = fail[temp];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">output</span><span class="params">(<span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> ansnum = <span class="number">0</span>, anstime = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= n; i++)</span><br><span class="line">            <span class="keyword">if</span> (num[i] &gt; <span class="number">0</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                ansnum++;</span><br><span class="line">                anstime += num[i];</span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">"%s times: %d\n"</span>, ss[i], num[i]);</span><br><span class="line">            &#125;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"texts num: %d\n"</span>, ansnum); <span class="comment">//每个单词出现次数最多为1</span></span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"texts times: %d\n"</span>, anstime); <span class="comment">//每个单词出现次数最多为无限</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">bool</span> <span class="title">output1</span><span class="params">(<span class="keyword">int</span> n, <span class="keyword">int</span> id)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">auto</span> flag = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">1</span>; i &lt;= n; i++)</span><br><span class="line">            <span class="keyword">if</span> (num[i] &gt; <span class="number">0</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (!flag)</span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="built_in">cout</span> &lt;&lt; <span class="string">"String "</span> &lt;&lt; id &lt;&lt; <span class="string">":"</span>; <span class="comment">// 匹配成功的串编号</span></span><br><span class="line">                    flag = <span class="literal">true</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="built_in">cout</span> &lt;&lt; <span class="string">" "</span> &lt;&lt; i; <span class="comment">// 匹配到的原串编号</span></span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (flag)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125; AC;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">AUTO</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line">    <span class="keyword">while</span> (<span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;n) != EOF)</span><br><span class="line">    &#123;</span><br><span class="line">        AC.init();</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= n; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="built_in">scanf</span>(<span class="string">"%s"</span>, AC.ss[i]);</span><br><span class="line">            AC.insert(AC.ss[i], i);</span><br><span class="line">        &#125;</span><br><span class="line">        AC.build();</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">"%s"</span>, AC.str);</span><br><span class="line">        AC.query(AC.str, n);</span><br><span class="line">        AC.output(n);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">AUTO1</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; n;</span><br><span class="line"></span><br><span class="line">    AC.init();</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">1</span>; i &lt;= n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">cin</span> &gt;&gt; AC.ss[i];</span><br><span class="line">        AC.insert(AC.ss[i], i);</span><br><span class="line">    &#125;</span><br><span class="line">    AC.build();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> m;</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; m;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">auto</span> total = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">1</span>; i &lt;= m; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">cin</span> &gt;&gt; AC.str;</span><br><span class="line">        AC.query(AC.str, n);</span><br><span class="line">        <span class="keyword">if</span> (AC.output1(n, i)) total++;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">cout</span> &lt;&lt; <span class="string">"total: "</span> &lt;&lt; total &lt;&lt; <span class="built_in">endl</span>; <span class="comment">// 匹配成功数量</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="最长上升子序列-LIS"><a href="#最长上升子序列-LIS" class="headerlink" title="最长上升子序列 LIS"></a>最长上升子序列 LIS</h4><h5 id="动态规划"><a href="#动态规划" class="headerlink" title="动态规划"></a>动态规划</h5><p>直接 DP 问题不大，注意一下给你的如果是个空数组就行了</p><p>对于位置 i ，dp[i] 表示以 nums[i] 结尾的 LIS 的长度</p><p>所以初始化 dp[i]=1, 1&lt;=i&lt;=n 毕竟每个位置自身就是长度为1的 LIS</p><p>对于位置 i ，dp[i] 一定是由前面的结尾的值小于 nums[i] 的位置转移过来的</p><p>所以 <code>dp[i]=max(dp[j]+1), 1&lt;=j&lt;i, a[j]&lt;a[i]</code></p><p>$O(n^2)$ 的时间， $O(n)$ 的空间，最长不降子序列加等号就行</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">lengthOfLIS</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&amp; nums)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="function"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; <span class="title">dp</span><span class="params">(nums.size(), <span class="number">1</span>)</span></span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; nums.size(); i++)</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">auto</span> j = <span class="number">0</span>; j &lt; i; j++)</span><br><span class="line">                <span class="keyword">if</span> (nums[i] &gt; nums[j]) dp[i] = max(dp[i], dp[j] + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">auto</span> ans = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> it : dp) ans = max(ans, it);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h5 id="二分查找优化"><a href="#二分查找优化" class="headerlink" title="二分查找优化"></a>二分查找优化</h5><p>有一个题解是这样说的，道理是这个道理，然而我不知道为什么这样是对的：</p><ul><li>新建数组 cell，用于保存最长上升子序列</li><li>对原序列进行遍历，将每位元素二分插入 cell 中</li><li>如果 cell 中元素都比它小，将它插到最后</li><li>否则，用它覆盖掉比它大的元素中最小的那个。</li><li>总之，思想就是让 cell 中存储比较小的元素。这样，cell 未必是真实的最长上升子序列，但长度是对的。</li></ul><p>当然还有一个我能理解的办法，不然我也不会写这个东西了</p><p>这个办法的核心是维护一个数组，d[i] 表示长度为 i 的 LIS 的末尾元素的最小值，初始化 d<a href="https://cdn.luogu.org/upload/pic/28671.png" target="_blank" rel="noopener">1</a>=nums[0] 。同时维护一个变量 len 标记目前的 LIS 长度</p><p>遍历数组，对于每一个元素 nums[i]：</p><ul><li>如果这个元素大于已知的最长 LIS 的末尾元素，那么我们就找到了一个更长的 LIS ，因此 len++, d[len]=nums[i]</li><li>否则二分查找数组 d ，找到第一个比 nums[i] 小的位置 j，j 就是这个元素前面能用的最大 LIS 长度，d[j+1] 肯定是大于nums[i] ，那么现在长度为 j+1 的 LIS 末尾元素最小值就应该是 nums[i]，d[j+1]=nums[i]</li></ul><p>这样操作数组 d 肯定是单调的，所以可以用二分查找</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">lengthOfLIS</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&amp; nums)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (nums.empty()) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; <span class="title">d</span><span class="params">(nums.size() + <span class="number">1</span>, <span class="number">0</span>)</span></span>;</span><br><span class="line">        <span class="keyword">auto</span> len = <span class="number">1</span>;</span><br><span class="line">        d[<span class="number">1</span>] = nums[<span class="number">0</span>];</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> it : nums)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (it &gt; d[len])</span><br><span class="line">            &#123;</span><br><span class="line">                len++;</span><br><span class="line">                d[len] = it;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="keyword">auto</span> index = lower_bound(d.begin() + <span class="number">1</span>, d.begin() + <span class="number">1</span> + len, it) - d.begin();</span><br><span class="line">                d[index] = it;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> len;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><hr><h4 id="后缀数组"><a href="#后缀数组" class="headerlink" title="后缀数组"></a>后缀数组</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//rrank:rrank[i]为起始位置为i的后缀的排名，i:[0,len)</span></span><br><span class="line"><span class="comment">// sa:sa[i]为排名为i的后缀的起始位置，i:[0,len)</span></span><br><span class="line"><span class="comment">//height:height[i]排名为i和i-1的后缀的lcp，i:(0,len)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn = <span class="number">233333</span>;</span><br><span class="line"><span class="keyword">char</span> s[maxn];</span><br><span class="line"><span class="keyword">int</span> t1[maxn], t2[maxn], cc[maxn], x[maxn], sa[maxn], rrank[maxn], height[maxn];</span><br><span class="line"><span class="keyword">int</span> len;</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">cmp</span><span class="params">(<span class="keyword">int</span> *y, <span class="keyword">int</span> a, <span class="keyword">int</span> b, <span class="keyword">int</span> k)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> a1 = y[a];</span><br><span class="line">    <span class="keyword">int</span> b1 = y[b];</span><br><span class="line">    <span class="keyword">int</span> a2 = a + k &gt;= len ? <span class="number">-1</span> : y[a + k];</span><br><span class="line">    <span class="keyword">int</span> b2 = b + k &gt;= len ? <span class="number">-1</span> : y[b + k];</span><br><span class="line">    <span class="keyword">return</span> a1 == b1 &amp;&amp; a2 == b2;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">make_sa</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> *x = t1, *y = t2;</span><br><span class="line">    <span class="keyword">int</span> m = <span class="number">256</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; m; i++) cc[i] = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len; i++) ++cc[x[i] = s[i]];</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; m; i++) cc[i] += cc[i - <span class="number">1</span>];</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = len - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) sa[--cc[x[i]]] = i;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">1</span>; k &lt;= len; k &lt;&lt;= <span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> p = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = len - k; i &lt; len; i++) y[p++] = i;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len; i++)</span><br><span class="line">            <span class="keyword">if</span> (sa[i] &gt;= k) y[p++] = sa[i] - k;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; m; i++) cc[i] = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len; i++) ++cc[x[y[i]]];</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; m; i++) cc[i] += cc[i - <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = len - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) sa[--cc[x[y[i]]]] = y[i];</span><br><span class="line"></span><br><span class="line">        swap(x, y);</span><br><span class="line">        m = <span class="number">1</span>;</span><br><span class="line">        x[sa[<span class="number">0</span>]] = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; len; i++)</span><br><span class="line">            x[sa[i]] = cmp(y, sa[i], sa[i - <span class="number">1</span>], k) ? m - <span class="number">1</span> : m++;</span><br><span class="line">        <span class="keyword">if</span> (m &gt;= len) <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">make_height</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len; i++) rrank[sa[i]] = i;</span><br><span class="line">    height[<span class="number">0</span>] = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">int</span> k = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; len; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (!rrank[i]) <span class="keyword">continue</span>;</span><br><span class="line">        <span class="keyword">int</span> j = sa[rrank[i] - <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">if</span> (k) k--;</span><br><span class="line">        <span class="keyword">while</span> (s[i + k] == s[j + k]) k++;</span><br><span class="line">        height[rrank[i]] = k;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">init</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">memset</span>(s, <span class="number">0</span>, <span class="keyword">sizeof</span>(s));</span><br><span class="line">    <span class="built_in">memset</span>(t1, <span class="number">0</span>, <span class="keyword">sizeof</span>(t1));</span><br><span class="line">    <span class="built_in">memset</span>(t2, <span class="number">0</span>, <span class="keyword">sizeof</span>(t2));</span><br><span class="line">    <span class="built_in">memset</span>(cc, <span class="number">0</span>, <span class="keyword">sizeof</span>(cc));</span><br><span class="line">    <span class="built_in">memset</span>(x, <span class="number">0</span>, <span class="keyword">sizeof</span>(x));</span><br><span class="line">    <span class="built_in">memset</span>(sa, <span class="number">0</span>, <span class="keyword">sizeof</span>(sa));</span><br><span class="line">    <span class="built_in">memset</span>(rrank, <span class="number">0</span>, <span class="keyword">sizeof</span>(rrank));</span><br><span class="line">    <span class="built_in">memset</span>(height, <span class="number">0</span>, <span class="keyword">sizeof</span>(height));</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%s"</span>, s);</span><br><span class="line">    len = <span class="built_in">strlen</span>(s);</span><br><span class="line">    make_sa();</span><br><span class="line">    make_height();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="编辑距离"><a href="#编辑距离" class="headerlink" title="编辑距离"></a>编辑距离</h4><h5 id="定义-2"><a href="#定义-2" class="headerlink" title="定义"></a>定义</h5><p>编辑距离（Edit Distance），又称 Levenshtein 距离。</p><p>编辑距离是指两个字符串之间，由一个字符串转化为另一个字符串所需的<strong>最小</strong>编辑操作次数。</p><p>许可的编辑操作包括：</p><ul><li>在原串中添加一个字符</li><li>在原串中删除一个字符</li><li>在原串中修改一个字符</li></ul><h5 id="解法"><a href="#解法" class="headerlink" title="解法"></a>解法</h5><p>解法当然是 DP 了！</p><p>先来看看操作，设原串为 A 新串为 B，A 串的长度为 n，B 串的长度为 m，那么现在就有对两个串的 6 种操作。</p><p>然而我们可以把操作简化为三种：</p><ul><li>在 A 中添加一个字符（等价于在 B 中删除一个字符）</li><li>在 B 中添加一个字符（等价于在 A 中删除一个字符）</li><li>在 A 中修改一个字符（等价于在 B 中修改一个字符） </li></ul><p>然后看看转移，这里用 <code>dp[i][j]</code> 表示 A 从头开始的 i 个字符与 B 从头开始的 j 个字符。</p><p><strong>i 和 j 为 0 的时候就表示空串。所以这个二维数组应该开到 <code>dp[n + 1][m + 1]</code> 。</strong></p><p>对于 <code>dp[i][j]</code> 可以由下面三种方式转移得到：</p><ul><li><code>dp[i - 1][j] + 1</code> 只需要在现有 A 串的末尾添加一个字符即可</li><li><code>dp[i][j - 1] + 1</code> 只需要在现有 B 串的末尾添加一个字符即可</li><li><code>dp[i - 1][j - 1] + (A[i - 1] == B[i - 1] ? 0 : 1)</code> 这里需要判断 A 串中第 i 个字符（下标 i - 1）和 B 串中第 j 个字符（下标 j - 1）是否相同。相同的话直接转移，不同的话需要把 A[i - 1] 修改为 B[j - 1]，因此编辑距离增加 1</li></ul><p>因此</p><p>$$<br>dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i][j]+(A[i - 1] == B[i - 1] ? 0 : 1))<br>$$</p><p>最后看看边界条件，由于空串到任意一个串只需要不断加加加，一个串到空串只需要不断减减减，所以：</p><ul><li><code>dp[i][0] = i</code> 在 B 中添加 i 个字符</li><li><code>dp[0][j] = j</code> 在 A 中添加 j 个字符</li></ul><p>条件齐了，将 i 和 j 从 0 推到 n 和 m 即可，正推时所有前置条件都已经算完了。</p><p>时空复杂度均为 $O(nm)$。</p><h5 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">minDistance</span><span class="params">(<span class="built_in">string</span> word1, <span class="built_in">string</span> word2)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="function"><span class="built_in">vector</span>&lt;<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&gt; <span class="title">dp</span><span class="params">(word1.size() + <span class="number">1</span>, <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;(word2.size() + <span class="number">1</span>))</span></span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; dp.size(); i++) dp[i][<span class="number">0</span>] = i;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> j = <span class="number">0</span>; j &lt; dp[<span class="number">0</span>].size(); j++) dp[<span class="number">0</span>][j] = j;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">1</span>; i &lt; dp.size(); i++)</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">auto</span> j = <span class="number">1</span>; j &lt; dp[<span class="number">0</span>].size(); j++)</span><br><span class="line">                dp[i][j] = min(&#123;</span><br><span class="line">                    dp[i - <span class="number">1</span>][j] + <span class="number">1</span>,</span><br><span class="line">                    dp[i][j - <span class="number">1</span>] + <span class="number">1</span>,</span><br><span class="line">                    dp[i - <span class="number">1</span>][j - <span class="number">1</span>] + (word1[i - <span class="number">1</span>] == word2[j - <span class="number">1</span>] ? <span class="number">0</span> : <span class="number">1</span>)</span><br><span class="line">                &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> dp[word1.size()][word2.size()];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><hr><h3 id="排序"><a href="#排序" class="headerlink" title="排序"></a>排序</h3><h4 id="快速排序"><a href="#快速排序" class="headerlink" title="快速排序"></a>快速排序</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 0下标</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">quicksort</span><span class="params">(<span class="keyword">int</span> b, <span class="keyword">int</span> e, <span class="keyword">int</span> a[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">auto</span> i = b, j = e, x = a[(b + e) / <span class="number">2</span>];</span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">while</span> (a[i] &lt; x) i++;</span><br><span class="line">        <span class="keyword">while</span> (a[j] &gt; x) j--;</span><br><span class="line">        <span class="keyword">if</span> (i &lt;= j) swap(a[i++], a[j--]);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">while</span> (i &lt; j);</span><br><span class="line">    <span class="keyword">if</span> (i &lt; e) quicksort(i, e, a);</span><br><span class="line">    <span class="keyword">if</span> (j &gt; b) quicksort(b, j, a);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">quicksort</span><span class="params">(<span class="keyword">int</span> b, <span class="keyword">int</span> e, <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&amp; a)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">auto</span> i = b, j = e, x = a[(b + e) / <span class="number">2</span>];</span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">while</span> (a[i] &lt; x) i++;</span><br><span class="line">        <span class="keyword">while</span> (a[j] &gt; x) j--;</span><br><span class="line">        <span class="keyword">if</span> (i &lt;= j) swap(a[i++], a[j--]);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">while</span> (i &lt; j);</span><br><span class="line">    <span class="keyword">if</span> (i &lt; e) quicksort(i, e, a);</span><br><span class="line">    <span class="keyword">if</span> (j &gt; b) quicksort(b, j, a);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 开始选中间的数为 flag，把 flag 位置和最后一个位置交换</span></span><br><span class="line"><span class="comment">// lpos 为比 flag 小的最后一个位置，rpos 从 L 扫到 R-1，遇到一个比 flag 小的就 lpos++，交换 lpos 和 rpos</span></span><br><span class="line"><span class="comment">// 一轮完了 lpos++，此时的 lpos 为 flag 的正确位置，交换 lpos 和 R</span></span><br><span class="line"><span class="comment">// 递归处理 L 到 lpos-1 和 lpos+1 到 R</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">qksort</span><span class="params">(<span class="keyword">const</span> <span class="keyword">int</span> L, <span class="keyword">const</span> <span class="keyword">int</span> R, <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&amp; v)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (L &gt;= R) <span class="keyword">return</span>;</span><br><span class="line">    <span class="keyword">const</span> <span class="keyword">auto</span> flag = v[(L + R) / <span class="number">2</span>];</span><br><span class="line">    swap(v[R], v[(L + R) / <span class="number">2</span>]);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">auto</span> lpos = L - <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> rpos = L; rpos &lt; R; rpos++)</span><br><span class="line">        <span class="keyword">if</span> (v[rpos] &lt; flag)</span><br><span class="line">        &#123;</span><br><span class="line">            lpos++;</span><br><span class="line">            swap(v[lpos], v[rpos]);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    lpos++;</span><br><span class="line">    swap(v[lpos], v[R]);</span><br><span class="line"></span><br><span class="line">    qksort(L, lpos - <span class="number">1</span>, v);</span><br><span class="line">    qksort(lpos + <span class="number">1</span>, R, v);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="归并排序"><a href="#归并排序" class="headerlink" title="归并排序"></a>归并排序</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> MAXN = <span class="number">200000</span>;</span><br><span class="line"><span class="keyword">int</span> a[MAXN];<span class="comment">//待排序</span></span><br><span class="line"><span class="keyword">int</span> t[MAXN];<span class="comment">//额外空间</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">msort</span><span class="params">(<span class="keyword">int</span> b, <span class="keyword">int</span> e)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (e - b &lt;= <span class="number">0</span>) <span class="keyword">return</span>;</span><br><span class="line">    <span class="keyword">int</span> mid = (b + e) / <span class="number">2</span>, p1 = b, p2 = mid + <span class="number">1</span>, i = b;</span><br><span class="line">    msort(b, mid);</span><br><span class="line">    msort(mid + <span class="number">1</span>, e);</span><br><span class="line">    <span class="keyword">while</span> (p1 &lt;= mid || p2 &lt;= e)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (p2 &gt; e || (p1 &lt;= mid &amp;&amp; a[p1] &lt;= a[p2])) t[i++] = a[p1++];</span><br><span class="line">        <span class="keyword">else</span> t[i++] = a[p2++];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = b; i &lt;= e; i++) a[i] = t[i];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="搜索"><a href="#搜索" class="headerlink" title="搜索"></a>搜索</h3><h4 id="N皇后"><a href="#N皇后" class="headerlink" title="N皇后"></a>N皇后</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">queen</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n, i, odd;</span><br><span class="line">    <span class="keyword">while</span> (<span class="built_in">cin</span> &gt;&gt; n)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (n &lt; <span class="number">4</span>) <span class="built_in">cout</span> &lt;&lt; <span class="string">"Impossible"</span>;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> ((n / <span class="number">2</span>) % <span class="number">3</span> != <span class="number">1</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="built_in">cout</span> &lt;&lt; <span class="number">2</span>;</span><br><span class="line">            <span class="keyword">for</span> (i = <span class="number">4</span>; i &lt;= n; i += <span class="number">2</span>) <span class="built_in">cout</span> &lt;&lt; <span class="string">" "</span> &lt;&lt; i;</span><br><span class="line">            <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= n; i += <span class="number">2</span>) <span class="built_in">cout</span> &lt;&lt; <span class="string">" "</span> &lt;&lt; i;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (n % <span class="number">2</span> == <span class="number">0</span>) odd = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                n--;</span><br><span class="line">                odd = <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="built_in">cout</span> &lt;&lt; n / <span class="number">2</span>;</span><br><span class="line">            <span class="keyword">for</span> (i = n / <span class="number">2</span> + <span class="number">1</span>; i != n / <span class="number">2</span> - <span class="number">1</span>; i = (i + <span class="number">2</span>) % n) <span class="built_in">cout</span> &lt;&lt; <span class="string">" "</span> &lt;&lt; i + <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">for</span> (i = (i + n - <span class="number">2</span>) % n; i != n / <span class="number">2</span> - <span class="number">1</span>; i = (i + n - <span class="number">2</span>) % n) <span class="built_in">cout</span> &lt;&lt; <span class="string">" "</span> &lt;&lt; n - i;</span><br><span class="line">            <span class="built_in">cout</span> &lt;&lt; <span class="string">" "</span> &lt;&lt; n - i;</span><br><span class="line">            <span class="keyword">if</span> (odd) <span class="built_in">cout</span> &lt;&lt; <span class="string">" "</span> &lt;&lt; n + <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">cout</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="BFS-队列版本"><a href="#BFS-队列版本" class="headerlink" title="BFS 队列版本"></a>BFS 队列版本</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> pair&lt;<span class="keyword">int</span>, <span class="keyword">int</span>&gt; P; <span class="comment">//点的坐标</span></span><br><span class="line"><span class="keyword">char</span> <span class="built_in">map</span>[MAXN][MAXM]; <span class="comment">//地图数组</span></span><br><span class="line"><span class="keyword">int</span> n, m; <span class="comment">//地图行列数</span></span><br><span class="line"><span class="keyword">int</span> start_s, start_y, end_x, end_y; <span class="comment">//起点终点坐标</span></span><br><span class="line"><span class="keyword">int</span> d[MAXN][MAXM] = &#123;<span class="number">0</span>&#125;; <span class="comment">//记录走到该坐标需要的最短步数</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">bfs</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">queue</span>&lt;P&gt; q;</span><br><span class="line">    q.push(P(start_s, start_y)); <span class="comment">//将起点放进队列中</span></span><br><span class="line">    d[start_s][start_y] = <span class="number">0</span>; <span class="comment">//到起点步数为0</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (!q.empty())</span><br><span class="line">    &#123;</span><br><span class="line">        P p = q.front(); <span class="comment">//定义当前队列顶端坐标为P</span></span><br><span class="line">        q.pop();<span class="comment">//将P弹出 @</span></span><br><span class="line">        <span class="keyword">if</span> (p.first == end_x &amp;&amp; p.second == end_y) <span class="keyword">break</span>;<span class="comment">//判断该坐标是否是终点，是的话结束</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; <span class="number">4</span>; i++)<span class="comment">//使坐标不断向四个方向移动</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">int</span> x = p.first + dx[i];</span><br><span class="line">            <span class="keyword">int</span> y = p.second + dy[i];</span><br><span class="line">            <span class="keyword">if</span> (<span class="number">0</span> &lt;= x &amp;&amp; x &lt; n &amp;&amp; <span class="number">0</span> &lt;= y &amp;&amp; y &lt;= m &amp;&amp; <span class="built_in">map</span>[x][y] != <span class="string">'#'</span> &amp;&amp; d[x][y] == <span class="number">0</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="comment">//当前坐标某方位是否可移动判断</span></span><br><span class="line">                q.push(P(x, y)); <span class="comment">//如果坐标当前某方向可移动，则将该位置该点坐标放入队列中</span></span><br><span class="line">                d[x][y] = d[p.first][p.second] + <span class="number">1</span>; <span class="comment">//记录该位置的最短步数 = 上一位置到达步数 + 1</span></span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//如果四个方位都不行则将顶点位置弹出，直到返回上一个有多个出口的位置</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="C"><a href="#C" class="headerlink" title="C++"></a>C++</h3><h4 id="引用"><a href="#引用" class="headerlink" title="引用"></a>引用</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//引用(reference)为对象起了另一个名字，将引用与初始值绑定(bind)在一起，二者类型需相同</span></span><br><span class="line"><span class="comment">//引用及别名</span></span><br><span class="line"><span class="comment">//必须初始化，初始化后无法重新绑定</span></span><br><span class="line"><span class="comment">//使用 &amp;d 其中d为变量</span></span><br><span class="line"><span class="keyword">int</span> a;</span><br><span class="line"><span class="keyword">char</span> b;</span><br><span class="line"><span class="keyword">int</span> &amp;aa = a;</span><br><span class="line"><span class="keyword">auto</span> &amp;bb = b;<span class="comment">//auto将自动识别类型 C++11</span></span><br></pre></td></tr></table></figure><hr><h4 id="范围for"><a href="#范围for" class="headerlink" title="范围for"></a>范围for</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//C++ 11</span></span><br><span class="line"><span class="comment">//for (变量 : 序列) 语句</span></span><br><span class="line"><span class="comment">//范围for可以在不知道开始和结尾的情况下进行遍历</span></span><br><span class="line"><span class="comment">//序列均可返回迭代器的begin和end成员</span></span><br><span class="line"><span class="comment">//可以为 初始值列表(&#123;1,2,3&#125;) 数组 string vector map set...</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//声明变量若未使用引用，则只读不可写</span></span><br><span class="line"><span class="built_in">map</span>&lt;<span class="keyword">int</span>, <span class="keyword">int</span>&gt; <span class="built_in">map</span> = &#123; &#123;<span class="number">1</span>,<span class="number">1</span>&#125;,&#123;<span class="number">2</span>,<span class="number">2</span>&#125; &#125;;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> i : <span class="built_in">map</span>)</span><br><span class="line">    <span class="built_in">cout</span> &lt;&lt; i.first &lt;&lt; <span class="built_in">endl</span> &lt;&lt; i.second &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//使用引用，可写</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> &amp;i : <span class="built_in">map</span>) i.second++;</span><br></pre></td></tr></table></figure><hr><h4 id="列表"><a href="#列表" class="headerlink" title="列表"></a>列表</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//c++11</span></span><br><span class="line"><span class="comment">//循环可以使用列表，类似Python list</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i:&#123;<span class="number">2</span>, <span class="number">3</span>, <span class="number">7</span>, <span class="number">61</span>, <span class="number">24251</span>&#125;) &#123;<span class="built_in">cout</span>&lt;&lt;i;&#125;</span><br><span class="line"><span class="comment">//多个最值的比较</span></span><br><span class="line"><span class="keyword">int</span> x = max(&#123; <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> &#125;);</span><br></pre></td></tr></table></figure><hr><h4 id="二进制读写"><a href="#二进制读写" class="headerlink" title="二进制读写"></a>二进制读写</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 将int以二进制输出（四个字节）</span></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="title">output_int</span><span class="params">(ofstream&amp; out, <span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">3</span>; i &gt;= <span class="number">0</span>; i--)</span><br><span class="line">    &#123;</span><br><span class="line">        out &lt;&lt; *(<span class="keyword">reinterpret_cast</span>&lt;<span class="keyword">char</span>*&gt;(&amp;x) + i);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 将int以二进制输入（四个字节）</span></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">int</span> <span class="title">input_int</span><span class="params">(ifstream&amp; in)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">auto</span> ans = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; <span class="number">4</span>; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        ans &lt;&lt;= <span class="number">8</span>;</span><br><span class="line">        <span class="keyword">char</span> temp;</span><br><span class="line">        in &gt;&gt; temp;</span><br><span class="line">        ans |= <span class="keyword">static_cast</span>&lt;<span class="keyword">unsigned</span> <span class="keyword">char</span>&gt;(temp);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="头文件"><a href="#头文件" class="headerlink" title="头文件"></a>头文件</h4><h5 id="lt-builtin-gt-内建函数"><a href="#lt-builtin-gt-内建函数" class="headerlink" title="&lt; __builtin &gt; 内建函数"></a>&lt; __builtin &gt; 内建函数</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">__builtin_clz(x)         <span class="comment">//返回x的二进制前导0的个数</span></span><br><span class="line">__builtin_ctz(x)         <span class="comment">//返回x的二进制末尾0的个数</span></span><br><span class="line">__builtin_popcount(x)    <span class="comment">//返回x的二进制中1的个数</span></span><br><span class="line">__builtin_parity(x)      <span class="comment">//返回x的二进制中1的个数的奇偶性，0偶1奇</span></span><br><span class="line">__builtin_ffs(x)         <span class="comment">//返回x的二进制中末尾最后一个1的位置，编号从1开始</span></span><br><span class="line"><span class="comment">//以上函数的long long版本：</span></span><br><span class="line">__builtin_clzll</span><br><span class="line">__builtin_ctzll</span><br><span class="line">__builtin_popcountll</span><br></pre></td></tr></table></figure><hr><h5 id="lt-cmath-gt-数学函数"><a href="#lt-cmath-gt-数学函数" class="headerlink" title="&lt; cmath &gt; 数学函数"></a>&lt; cmath &gt; 数学函数</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//基础运算</span></span><br><span class="line"><span class="built_in">abs</span>(x)          <span class="comment">//x的绝对值，整型</span></span><br><span class="line"><span class="built_in">fabs</span>(x)         <span class="comment">//x的绝对值，浮点</span></span><br><span class="line"><span class="built_in">ceil</span>(x)         <span class="comment">//x向上取整</span></span><br><span class="line"><span class="built_in">floor</span>(x)        <span class="comment">//x向下取整</span></span><br><span class="line">round(x)        <span class="comment">//x的四舍五入值</span></span><br><span class="line">trunc(x)        <span class="comment">//截取x的整数部分</span></span><br><span class="line"><span class="built_in">fmod</span>(x, y)      <span class="comment">//x/y的浮点数余数</span></span><br><span class="line"><span class="comment">//指数/对数</span></span><br><span class="line"><span class="built_in">pow</span>(x, y)       <span class="comment">//x的y次幂</span></span><br><span class="line"><span class="built_in">exp</span>(x)          <span class="comment">//e的x次幂</span></span><br><span class="line"><span class="built_in">sqrt</span>(x)         <span class="comment">//x的平方根</span></span><br><span class="line">cbrt(x)         <span class="comment">//x的立方根 C++11</span></span><br><span class="line">(<span class="keyword">int</span>)(<span class="built_in">pow</span>(x,<span class="number">1.0</span>/<span class="number">3.0</span>)+<span class="number">0.5</span>) <span class="comment">//等价，0.5用于四舍五入</span></span><br><span class="line"><span class="built_in">log</span>(x)          <span class="comment">//x以e为底的对数</span></span><br><span class="line"><span class="built_in">log10</span>(x)        <span class="comment">//x以10为底的对数</span></span><br><span class="line">log2(x)         <span class="comment">//x以2为底的对数</span></span><br><span class="line"><span class="comment">//三角函数</span></span><br><span class="line"><span class="built_in">acos</span>(x)         <span class="comment">//x的反余弦</span></span><br><span class="line"><span class="built_in">asin</span>(x)         <span class="comment">//x的反正弦</span></span><br><span class="line"><span class="built_in">atan</span>(x)         <span class="comment">//x的反正切</span></span><br><span class="line"><span class="built_in">atan2</span>(y, x)     <span class="comment">//点(x, y)与x轴正方向的夹角(返回值范围(-π, π])</span></span><br><span class="line">hypot(x, y)     <span class="comment">//返回直角三角形斜边的长度：√(x2+y^2)</span></span><br></pre></td></tr></table></figure><hr><h5 id="lt-random-gt-随机函数"><a href="#lt-random-gt-随机函数" class="headerlink" title="&lt; random &gt; 随机函数"></a>&lt; random &gt; 随机函数</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">mt19937 <span class="title">mt_rand</span><span class="params">(time(<span class="number">0</span>))</span>        <span class="comment">//初始化随机数生成器</span></span></span><br><span class="line"><span class="function"><span class="title">mt_rand</span><span class="params">()</span>                       <span class="comment">//返回一个随机的unsigned int值(0 ~ 4294967295)</span></span></span><br><span class="line"><span class="function"><span class="comment">//法二</span></span></span><br><span class="line"><span class="function"><span class="comment">//&lt;cstdlib&gt; &lt;ctime&gt; </span></span></span><br><span class="line"><span class="function"><span class="title">srand</span><span class="params">((<span class="keyword">unsigned</span>)time(<span class="literal">NULL</span>))</span></span>;</span><br><span class="line">a = rand() % <span class="number">9000</span> + <span class="number">1000</span>;</span><br></pre></td></tr></table></figure><hr><h5 id="lt-cctype-gt-字符类型"><a href="#lt-cctype-gt-字符类型" class="headerlink" title="&lt; cctype &gt; 字符类型"></a>&lt; cctype &gt; 字符类型</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">isalnum</span>()     <span class="comment">//如果参数是字母或数字，该函数返回true</span></span><br><span class="line"><span class="built_in">isalpha</span>()     <span class="comment">//如果参数是字母，该函数返回true</span></span><br><span class="line"><span class="built_in">isdigit</span>()     <span class="comment">//如果参数是数字，该函数返回true</span></span><br><span class="line"><span class="built_in">islower</span>()     <span class="comment">//如果参数是小写字母，该函数返回true</span></span><br><span class="line"><span class="built_in">isupper</span>()     <span class="comment">//如果参数是大写字母，该函数返回true</span></span><br><span class="line"><span class="built_in">isxdigit</span>()    <span class="comment">//如果参数是十六进制的数字，即0～9、a~f、A~F，该函数返回true</span></span><br><span class="line"><span class="built_in">tolower</span>()     <span class="comment">//如果参数是大写字符，则返回其小写，否则返回该参数</span></span><br><span class="line"><span class="built_in">toupper</span>()     <span class="comment">//如果参数是小写字母，则返回其大写，否则返回该参数</span></span><br></pre></td></tr></table></figure><hr><h5 id="lt-cstring-gt-C字符串"><a href="#lt-cstring-gt-C字符串" class="headerlink" title="&lt; cstring &gt; C字符串"></a>&lt; cstring &gt; C字符串</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">memset</span>(a, <span class="number">0</span>, <span class="keyword">sizeof</span>(a)) <span class="comment">//将数组a清零，理论上只能将数组全部变成0或-1,其他数也行，原因未知</span></span><br><span class="line"><span class="built_in">strlen</span>(str)             <span class="comment">//返回字符串str的长度（不包括'\0'）</span></span><br><span class="line"><span class="built_in">strcpy</span>(s1, s2)          <span class="comment">//复制字符串 s2 到字符串 s1</span></span><br><span class="line"><span class="built_in">strcat</span>(s1, s2)          <span class="comment">//把s2复制到s1已有的字符之后，形成连起的串</span></span><br><span class="line"><span class="built_in">strchr</span>(s1, ch)          <span class="comment">//返回一个指针，指向字符串 s1中字符 ch 的第一次出现的位置</span></span><br><span class="line"><span class="built_in">strstr</span>(s1, s2)          <span class="comment">//返回一个指针，指向字符串 s1 中字符串 s2 的第一次出现的位置</span></span><br><span class="line"><span class="built_in">strcmp</span>(s1, s2)          <span class="comment">//如果相同，则返回 0；如果 s1&lt;s2 则返回值小于 0；反之大于 0</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//数字与字符串转换 C++11</span></span><br><span class="line"><span class="built_in">string</span> s=to_string(x)   <span class="comment">//把数字x转换为字符串，x可以为任意数的类型</span></span><br><span class="line"><span class="keyword">int</span> n=stoi(s)           <span class="comment">//把字符串s转换为int类型</span></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> n=stoll(s)    <span class="comment">//把字符串s转换为long long类型</span></span><br></pre></td></tr></table></figure><hr><h5 id="lt-algorithm-gt-算法"><a href="#lt-algorithm-gt-算法" class="headerlink" title="&lt; algorithm &gt; 算法"></a>&lt; algorithm &gt; 算法</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">swap(a, b)    <span class="comment">//交换两个变量的值。</span></span><br><span class="line">max(a, b)     <span class="comment">//返回两个数中的较大值。</span></span><br><span class="line">min(a, b)     <span class="comment">//返回两个数中的较小值。</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//最值+列表，C++11</span></span><br><span class="line">max(&#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>&#125;)    <span class="comment">//大括号中多个值用逗号隔开</span></span><br><span class="line">min(&#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>&#125;)    <span class="comment">//大括号中多个值用逗号隔开</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//以下函数对STL类型的操作，(a, a + n) 改为 (a.begin(), a.end())</span></span><br><span class="line">max_element(a, a + n)        <span class="comment">//返回序列中最大值的地址。序列中最大值：*max_element(a, a + n)</span></span><br><span class="line">min_element(a, a + n)        <span class="comment">//返回序列中最小值的地址。序列中最小值：*min_element(a, a + n)</span></span><br><span class="line">reverse(a, a + n)            <span class="comment">//翻转一个n个元素的数组</span></span><br><span class="line">random_shuffle(a, a + n)     <span class="comment">//随机打乱一个n个元素的数组</span></span><br><span class="line">sort(a, a + n)               <span class="comment">//对n个元素的数组进行从小到大排序</span></span><br><span class="line">sort(a, a + n, greater&lt;<span class="keyword">int</span>&gt;())               <span class="comment">//对n个元素的数组进行从大到小排序</span></span><br><span class="line">sort(a, a + n, [](<span class="keyword">const</span> <span class="keyword">auto</span> &amp;a,<span class="keyword">const</span> <span class="keyword">auto</span> &amp;b) &#123;<span class="keyword">return</span> a&gt;b;&#125;)          <span class="comment">//自定义排序，排序方法由Lambda表达式的返回值决定（这里是从大到小），c++14，此时可用auto</span></span><br><span class="line"></span><br><span class="line">unique(a, a + n)             <span class="comment">//去除序列中相邻的重复元素，返回去重后的尾地址</span></span><br><span class="line">binary_search(a, a + n, x)   <span class="comment">//查找有序序列中是否存在元素x，找到返回1，否则返回0</span></span><br><span class="line">lower_bound(a, a + n, x, cmp)     <span class="comment">//返回有序序列中第一个≥x的值的迭代器</span></span><br><span class="line">upper_bound(a, a + n, x, cmp)     <span class="comment">//返回有序序列中第一个&gt;x的值的迭代器</span></span><br><span class="line">lower_bound(a, a + n, x, cmp) - a <span class="comment">//第一个≥x的值的数组下标</span></span><br><span class="line">upper_bound(a, a + n, x, cmp) – a <span class="comment">//第一个&gt;x的值的数组下标</span></span><br><span class="line"></span><br><span class="line">equal_range(a, a + n, x, cmp)     <span class="comment">//返回pair(x,y) ,x对应value的开始迭代器，y对应value的结束迭代器，左闭右开</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//取值前先判断：若不存在≥x的值，则会造成非法内存访问(Runtime Error)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//全排列</span></span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">next_permutation</span><span class="params">(iterator start,iterator end)</span> </span></span><br><span class="line"><span class="function"><span class="comment">//逆序是最大的一个，为假则已经是逆序</span></span></span><br><span class="line">int a[5] = &#123; 5,4,3,2,1 &#125;;</span><br><span class="line">sort(a, a + <span class="number">5</span>);<span class="comment">//顺序是最小的一个</span></span><br><span class="line">next_permutation(a, a + <span class="number">5</span>);<span class="comment">//下一个</span></span><br><span class="line">prev_permutation(a, a + <span class="number">5</span>);<span class="comment">//前一个</span></span><br></pre></td></tr></table></figure><hr><h5 id="lt-numeric-gt-数值序列"><a href="#lt-numeric-gt-数值序列" class="headerlink" title="&lt; numeric &gt; 数值序列"></a>&lt; numeric &gt; 数值序列</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//使用vector时应用v.begin()和v.end()</span></span><br><span class="line"></span><br><span class="line">iota(numbers, numbers + <span class="number">5</span>, <span class="number">-2.5</span>)</span><br><span class="line"><span class="comment">//从2.5开始生成++的递增序列放入numbers</span></span><br><span class="line"><span class="comment">// Values are -2.5 -1.5 -0.5 0.5 1.5 2.5 3.5 4.5 5.5</span></span><br><span class="line"></span><br><span class="line">accumulate(numbers, numbers + <span class="number">5</span>, init)</span><br><span class="line"><span class="comment">//求number的数列和 + init</span></span><br><span class="line"></span><br><span class="line">inner_product(series1, series1 + <span class="number">5</span>, series2, init)</span><br><span class="line"><span class="comment">//求series1和series2的内积/叉积</span></span><br><span class="line"></span><br><span class="line">adjacent_difference(numbers, numbers + <span class="number">5</span>, result)</span><br><span class="line"><span class="comment">//求相邻两个元素差放入result中</span></span><br><span class="line"></span><br><span class="line">partial_sum(numbers, numbers + <span class="number">5</span>, result)</span><br><span class="line"><span class="comment">//求前缀和放入result中</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> val[] = &#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>&#125;;</span><br><span class="line">partial_sum(val, val+<span class="number">5</span>, result, multiplies&lt;<span class="keyword">int</span>&gt;());</span><br><span class="line"><span class="comment">//求阶乘</span></span><br></pre></td></tr></table></figure><hr><h5 id="lt-utility-gt-二元组"><a href="#lt-utility-gt-二元组" class="headerlink" title="&lt; utility &gt; 二元组"></a>&lt; utility &gt; 二元组</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">pair&lt;<span class="built_in">string</span>, <span class="keyword">int</span>&gt; planet;        <span class="comment">//定义一个&lt;string, int&gt;二元组</span></span><br><span class="line">pair&lt;int, double&gt; p1(1, 2.4);    //声明并初始化</span><br><span class="line">planet.first = <span class="string">"Earth"</span>;</span><br><span class="line">planet.second = <span class="number">6371</span>;            <span class="comment">//给二元组中的两个元素单独赋值</span></span><br><span class="line">planet = &#123;<span class="string">"Earth"</span>, <span class="number">6371</span>&#125;;        <span class="comment">//给二元组整体赋值</span></span><br><span class="line">p4 = make_pair(<span class="number">1</span>, <span class="number">2.4</span>);          <span class="comment">//赋值</span></span><br></pre></td></tr></table></figure><hr><h5 id="lt-string-gt-字符串"><a href="#lt-string-gt-字符串" class="headerlink" title="&lt; string &gt; 字符串"></a>&lt; string &gt; 字符串</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">s.size()</span><br><span class="line">s.length()      <span class="comment">//字符串s的长度</span></span><br><span class="line">s.clear()       <span class="comment">//清空字符串s</span></span><br><span class="line">s.erase(a,b);   <span class="comment">//从下标a开始，删除b个字符</span></span><br><span class="line">s.find(s1)      <span class="comment">//返回字符串s1在s中第一次出现的位置，如果没有则返回-1</span></span><br><span class="line">s.rfind(s1)     <span class="comment">//返回字符串s1在s中最后一次出现的位置，如果没有则返回-1</span></span><br><span class="line">s.substr(a,b);  <span class="comment">//从下标a开始，生成长度为b的子串</span></span><br><span class="line"><span class="comment">//可以直接比较，字典序</span></span><br></pre></td></tr></table></figure><hr><h5 id="lt-bitset-gt-01数组"><a href="#lt-bitset-gt-01数组" class="headerlink" title="&lt; bitset &gt; 01数组"></a>&lt; bitset &gt; 01数组</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">bitset</span>&lt;10000&gt; s;   <span class="comment">//定义一个10000位二进制数，&lt;&gt;中填写位数。</span></span><br><span class="line">~, &amp;, |, ^         <span class="comment">//按位与、或、异或</span></span><br><span class="line">&lt;&lt;、&gt;&gt;             <span class="comment">//左移、右移</span></span><br><span class="line">==、!=             <span class="comment">//比较两个bitset是否相等</span></span><br><span class="line">s[k]               <span class="comment">//表示s的第k位，最低位是第0位</span></span><br><span class="line">s.count()          <span class="comment">//返回s中有多少位为1。</span></span><br><span class="line">s.any()</span><br><span class="line">s.none()</span><br><span class="line"><span class="comment">//若s所有位都为0，则s.any()返回false，s.none()返回true</span></span><br><span class="line"><span class="comment">//若s至少一位为1，则s.any()返回true，s.none()返回false</span></span><br><span class="line">s.<span class="built_in">set</span>() / s.reset() / s.flip()</span><br><span class="line"><span class="comment">//把s的所有位变为1 / 变为0 / 取反</span></span><br></pre></td></tr></table></figure><hr><h5 id="lt-iterator-gt-迭代器"><a href="#lt-iterator-gt-迭代器" class="headerlink" title="&lt; iterator &gt; 迭代器"></a>&lt; iterator &gt; 迭代器</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//迭代器为指针</span></span><br><span class="line"><span class="comment">//该头文件实际可以不带</span></span><br><span class="line"><span class="comment">//用迭代器it遍历容器中的元素（这里it是指向当前元素的指针）</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> it = A.begin(); it != A.end(); it++) <span class="built_in">cout</span>&lt;&lt;*it&lt;&lt;<span class="built_in">endl</span>;</span><br></pre></td></tr></table></figure><hr><h5 id="lt-vector-gt-动态数组"><a href="#lt-vector-gt-动态数组" class="headerlink" title="&lt; vector &gt; 动态数组"></a>&lt; vector &gt; 动态数组</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">vector</span>&lt;<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&gt; v;            <span class="comment">//二维整型动态数组</span></span><br><span class="line"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; v1[n];                <span class="comment">//包含n个元素，二维数组</span></span><br><span class="line"><span class="function"><span class="built_in">vector</span>&lt;<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&gt; <span class="title">v2</span><span class="params">(n, val)</span></span>;   <span class="comment">//包含n个元素，且值为val</span></span><br><span class="line"><span class="built_in">vector</span>&lt;<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&gt;::iterator it; <span class="comment">//迭代器</span></span><br><span class="line"><span class="comment">//可以以字典序进行比较</span></span><br><span class="line"></span><br><span class="line">v.push_back(a)             <span class="comment">//向尾端插入a</span></span><br><span class="line">v.emplace_back(a)          <span class="comment">//向尾端插入a，c++11优化版，可以自动组成pair</span></span><br><span class="line">v.pop_back()               <span class="comment">//删除尾端元素</span></span><br><span class="line">v.empty()                  <span class="comment">//为空返回真</span></span><br><span class="line">v.size()                   <span class="comment">//返回元素个数</span></span><br><span class="line">v.clear()                  <span class="comment">//清空</span></span><br><span class="line">v.front()                  <span class="comment">//返回首元素值的引用</span></span><br><span class="line">v.back()                   <span class="comment">//返回尾元素值的引用</span></span><br><span class="line">v.begin()                  <span class="comment">//首元素指针</span></span><br><span class="line">v.end()                    <span class="comment">//v的尾元素的下一位置指针</span></span><br><span class="line">v.rbegin()                 <span class="comment">//尾元素指针</span></span><br><span class="line">v.end()                    <span class="comment">//v的首元素上一位置指针</span></span><br><span class="line">v.insert(it,i)             <span class="comment">//在迭代器it位置插入插入元素i</span></span><br><span class="line">v.emplace(it,i)            <span class="comment">//在迭代器it位置插入插入元素i，优化版</span></span><br><span class="line">v1 = v2;                   <span class="comment">//用v2中的元素拷贝替换v1</span></span><br><span class="line">v[i][j]                    <span class="comment">//引用，但不能以此方法添加</span></span><br><span class="line">reverse(v.begin(),v.end());<span class="comment">//翻转数组</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//排序后可以二分查找，返回迭代器，指向第一个不小于k的元素，O(n)</span></span><br><span class="line">lower_bound(v.begin(), v.end(), k, cmp)  </span><br><span class="line"><span class="comment">//排序后可以二分查找，返回迭代器，指向第一个大于k的元素，O(n)</span></span><br><span class="line">upper_bound(v.begin(), v.end(), k, cmp)  </span><br><span class="line"></span><br><span class="line"><span class="comment">//将数组里的元素随机排列，概率相同，O(n)</span></span><br><span class="line">random_shuffle(v.begin(), v.end());</span><br><span class="line"></span><br><span class="line"><span class="comment">//元素去重并删除，需要先排序</span></span><br><span class="line">v.erase(unique(v.begin(), v.end()), v.end());</span><br></pre></td></tr></table></figure><hr><h5 id="lt-map-gt-映射表"><a href="#lt-map-gt-映射表" class="headerlink" title="&lt; map &gt; 映射表"></a>&lt; map &gt; 映射表</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//map</span></span><br><span class="line"><span class="comment">//key-value组成，key唯一，升序排列</span></span><br><span class="line"><span class="comment">//value为数的时候，初始化可能不为0，需要clear（出现情况未知）</span></span><br><span class="line"><span class="comment">//遍历时key为const</span></span><br><span class="line"><span class="comment">//八倍常数</span></span><br><span class="line"><span class="comment">//不要使用数组下标m[i]进行访问，如果没有这个元素会自动创建，导致大小改变</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">map</span>&lt;<span class="keyword">int</span>, <span class="keyword">int</span>&gt; m = &#123; &#123;<span class="number">1</span>,<span class="number">3</span>&#125; &#125;;        <span class="comment">//初始化</span></span><br><span class="line">m.insert(&#123; <span class="number">2</span>,<span class="number">3</span> &#125;)                   <span class="comment">//插入元素</span></span><br><span class="line">m.insert(b, e)                      <span class="comment">//插入迭代器从b到e，返回值为成功数量</span></span><br><span class="line">m.emplcace(&#123; <span class="number">2</span>,<span class="number">3</span> &#125;)                 <span class="comment">//插入元素，优化版</span></span><br><span class="line">m[<span class="number">3</span>] = <span class="number">4</span>                            <span class="comment">//插入元素或者更改元素</span></span><br><span class="line">m.empty()                           <span class="comment">//为空返回真</span></span><br><span class="line">m.size()                            <span class="comment">//返回元素个数</span></span><br><span class="line">m.clear()                           <span class="comment">//清空</span></span><br><span class="line">m.find(k)                           <span class="comment">//寻找第一个关键值k，失败返回m.end()</span></span><br><span class="line">m.count(k)                          <span class="comment">//统计关键值k的数量</span></span><br><span class="line">m.begin()                           <span class="comment">//m的首元素（key值最小记录）指针</span></span><br><span class="line">m.end()                             <span class="comment">//m的尾元素（key值最大记录）的下一位置指针</span></span><br><span class="line">m.rbegin()                          <span class="comment">//m的尾元素（key值最大记录）指针</span></span><br><span class="line">m.rend()                            <span class="comment">//m的首元素（key值最小记录）的上一位置指针</span></span><br><span class="line">m.erase(k)                          <span class="comment">//删除元素k</span></span><br><span class="line"><span class="built_in">map</span>&lt;<span class="keyword">int</span>, <span class="keyword">int</span>&gt;::iterator it;         <span class="comment">//迭代器，-&gt;first -&gt;second引用</span></span><br><span class="line">m.erase(it, it + <span class="number">5</span>);                <span class="comment">//删除元素并改变长度，删除后要重置迭代器，返回值为删除成功的数量</span></span><br><span class="line">m.lower_bound(k);                   <span class="comment">//二分查找，返回迭代器，指向第一个不小于k的元素</span></span><br><span class="line">m.upper_bound(k);                   <span class="comment">//二分查找，返回迭代器，指向第一个大于k的元素</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//unordered_map 无序的映射，基本同map</span></span><br><span class="line"><span class="built_in">unordered_map</span>&lt;<span class="keyword">int</span>&gt; m;</span><br><span class="line"></span><br><span class="line"><span class="comment">//multimap 可重复的映射，一个key值对应多个value，并存放在一起，基本同map</span></span><br><span class="line"><span class="built_in">multimap</span>&lt;<span class="keyword">int</span>&gt; m;</span><br><span class="line">m.equal_range(x);                   <span class="comment">//返回pair(x,y) ,x对应value的开始迭代器，y对应value的结束迭代器，左闭右开</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//unordered_multimap 无序可重复的映射，基本同map</span></span><br><span class="line"><span class="built_in">unordered_multimap</span>&lt;<span class="keyword">int</span>&gt; m;</span><br></pre></td></tr></table></figure><hr><h5 id="lt-set-gt-集合"><a href="#lt-set-gt-集合" class="headerlink" title="&lt; set &gt; 集合"></a>&lt; set &gt; 集合</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//set</span></span><br><span class="line"><span class="comment">//key组成，key唯一，升序排列</span></span><br><span class="line"><span class="comment">//遍历时key为const</span></span><br><span class="line"><span class="built_in">set</span>&lt;<span class="keyword">int</span>&gt; s = &#123; <span class="number">1</span>,<span class="number">3</span> &#125;      <span class="comment">//初始化</span></span><br><span class="line"><span class="built_in">set</span>&lt;<span class="keyword">int</span>,less&lt;<span class="keyword">int</span>&gt;&gt; s;     <span class="comment">//初始化降序排列</span></span><br><span class="line"><span class="built_in">set</span>&lt;<span class="keyword">int</span>,greater&lt;<span class="keyword">int</span>&gt;&gt; s;  <span class="comment">//初始化升序排列</span></span><br><span class="line">s.insert(&#123; <span class="number">2</span>,<span class="number">3</span> &#125;)         <span class="comment">//插入元素</span></span><br><span class="line">s.emplcace(&#123; <span class="number">2</span>,<span class="number">3</span> &#125;)       <span class="comment">//插入元素，优化版</span></span><br><span class="line">s.insert(b, e)            <span class="comment">//插入迭代器从b到e，返回值为成功数量</span></span><br><span class="line">s.empty()                 <span class="comment">//为空返回真</span></span><br><span class="line">s.size()                  <span class="comment">//返回元素个数</span></span><br><span class="line">s.clear()                 <span class="comment">//清空</span></span><br><span class="line">s.find(k)                 <span class="comment">//寻找第一个关键值k，失败返回s.end()</span></span><br><span class="line">s.count(k)                <span class="comment">//统计关键值k的数量</span></span><br><span class="line">s.begin()                 <span class="comment">//s的首元素（最小元素）指针</span></span><br><span class="line">s.end()                   <span class="comment">//s的尾元素（最大元素）的下一位置指针</span></span><br><span class="line">s.rbegin()                <span class="comment">//s的尾元素（最大元素）指针</span></span><br><span class="line">s.rend()                  <span class="comment">//s的首元素（最小元素）的上一位置指针</span></span><br><span class="line"><span class="built_in">set</span>&lt;<span class="keyword">int</span>&gt;::iterator it；   <span class="comment">//迭代器</span></span><br><span class="line">s.erase(it, it + <span class="number">5</span>)       <span class="comment">//删除元素并改变长度，删除后需重置迭代器，返回值为删除成功的数量</span></span><br><span class="line">s.lower_bound(k)          <span class="comment">//二分查找，返回迭代器，指向第一个不小于k的元素</span></span><br><span class="line">s.upper_bound(k)          <span class="comment">//二分查找，返回迭代器，指向第一个大于k的元素</span></span><br><span class="line">set_union(A.begin(), A.end(), B.begin(), B.end(), C.begin())</span><br><span class="line"><span class="comment">//将集合A和集合B取并集存入集合C中，记得清空用于存放的集合</span></span><br><span class="line">set_intersection(A.begin(), A.end(), B.begin(), B.end(), C.begin())</span><br><span class="line"><span class="comment">//将集合A和集合B取交集存入集合C中，记得清空用于存放的集合</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//unordered_set 无序的集合，基本同set</span></span><br><span class="line"><span class="built_in">unordered_set</span>&lt;<span class="keyword">int</span>&gt; s = &#123; <span class="number">1</span>,<span class="number">3</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">//multiset 可重复的集合，基本同set</span></span><br><span class="line"><span class="built_in">multiset</span>&lt;<span class="keyword">int</span>&gt; s = &#123; <span class="number">1</span>,<span class="number">3</span>,<span class="number">3</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">//unordered_multiset 无序可重复的集合，基本同set</span></span><br><span class="line"><span class="built_in">unordered_multiset</span>&lt;<span class="keyword">int</span>&gt; s = &#123; <span class="number">1</span>,<span class="number">3</span>,<span class="number">3</span> &#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">//自定义set，需要重载运算符</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">set_type</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">int</span> num;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span> &lt; (<span class="keyword">const</span> set_type&amp; x, <span class="keyword">const</span> set_type&amp; y)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> x.num &lt; y.num;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="built_in">set</span>&lt;set_type&gt; s;</span><br></pre></td></tr></table></figure><hr><h5 id="lt-stack-gt-栈"><a href="#lt-stack-gt-栈" class="headerlink" title="&lt; stack &gt; 栈"></a>&lt; stack &gt; 栈</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">stack</span>&lt;<span class="keyword">int</span>&gt; s;  <span class="comment">//定义一个int类型的栈</span></span><br><span class="line">s.push(x)      <span class="comment">//将元素x压入栈顶</span></span><br><span class="line">s.pop()        <span class="comment">//弹出栈顶元素</span></span><br><span class="line">s.top()        <span class="comment">//访问栈顶元素</span></span><br><span class="line">s.empty()      <span class="comment">//判断栈s是否为空</span></span><br><span class="line">s.size()       <span class="comment">//栈s中的元素个数</span></span><br></pre></td></tr></table></figure><hr><h5 id="lt-queue-gt-队列"><a href="#lt-queue-gt-队列" class="headerlink" title="&lt; queue&gt; 队列"></a>&lt; queue&gt; 队列</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//先进先出队列</span></span><br><span class="line"><span class="built_in">queue</span>&lt;<span class="keyword">int</span>&gt; q;   <span class="comment">//定义一个int类型的队列</span></span><br><span class="line">q.push(x)       <span class="comment">//将元素x放入队尾</span></span><br><span class="line">q.pop()         <span class="comment">//移除队首元素</span></span><br><span class="line">q.front()       <span class="comment">//访问队首元素</span></span><br><span class="line">q.back()        <span class="comment">//访问队尾元素</span></span><br><span class="line">q.empty()       <span class="comment">//判断队列q是否为空</span></span><br><span class="line">q.size()        <span class="comment">//队列q中的元素个数</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//优先队列/堆</span></span><br><span class="line"><span class="comment">//int类型，大的优先，从大到小取出数值的优先队列（堆）</span></span><br><span class="line">priority_queue&lt;<span class="keyword">int</span>&gt; q;</span><br><span class="line"><span class="comment">//int类型，小的优先，从小到大取出数值的优先队列（堆）</span></span><br><span class="line">priority_queue&lt;<span class="keyword">int</span>, <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;, greater&lt;<span class="keyword">int</span>&gt;&gt; q;</span><br><span class="line"><span class="comment">//int类型，小的优先，自定义顺序</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">cmp1</span> &#123;</span> <span class="function"><span class="keyword">bool</span> <span class="title">operator</span> <span class="params">()</span><span class="params">(<span class="keyword">int</span> &amp;a, <span class="keyword">int</span> &amp;b)</span> </span>&#123; <span class="keyword">return</span> a &gt; b; &#125; &#125;;</span><br><span class="line">priority_queue&lt;<span class="keyword">int</span>, <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;, cmp1&gt;pq3;</span><br><span class="line"></span><br><span class="line"><span class="keyword">auto</span> cmp = [](<span class="keyword">const</span> <span class="keyword">auto</span>&amp; x, <span class="keyword">const</span> <span class="keyword">auto</span>&amp; y)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">return</span> x.first &gt; y.first;</span><br><span class="line">&#125;;</span><br><span class="line">priority_queue&lt;pair&lt;int, int&gt;, vector&lt;pair&lt;int, int&gt;&gt;, decltype(cmp)&gt; pq(cmp);</span><br><span class="line"></span><br><span class="line">q.push(x)       <span class="comment">//将元素x放入队列（堆）中</span></span><br><span class="line">q.pop()         <span class="comment">//移除堆顶元素</span></span><br><span class="line">q.top()         <span class="comment">//访问堆顶元素</span></span><br><span class="line">q.empty()       <span class="comment">//判断堆q是否为空</span></span><br><span class="line">q.size()        <span class="comment">//堆q中的元素个数</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//deque 双向队列</span></span><br><span class="line"><span class="comment">//两边都是开口的，均可进可出</span></span><br><span class="line"><span class="comment">//基本操作同queue</span></span><br><span class="line"><span class="built_in">deque</span>&lt;<span class="keyword">int</span>&gt; dq;</span><br><span class="line">dq.front()              <span class="comment">//访问首端元素</span></span><br><span class="line">dq.back()               <span class="comment">//访问尾端元素</span></span><br><span class="line">dq.push_front(i)        <span class="comment">//首端压入i</span></span><br><span class="line">dq.emplace_front(i)     <span class="comment">//首端压入i，c++11优化版</span></span><br><span class="line">dq.push_back(i)         <span class="comment">//尾端压入i</span></span><br><span class="line">dq.emplace_back(i)      <span class="comment">//尾端压入i，c++11优化版</span></span><br><span class="line">dq.pop_fron()           <span class="comment">//首端弹出元素</span></span><br><span class="line">dq.pop_back()           <span class="comment">//尾端弹出元素</span></span><br></pre></td></tr></table></figure><hr><h3 id="Python"><a href="#Python" class="headerlink" title="Python"></a>Python</h3><h4 id="输入"><a href="#输入" class="headerlink" title="输入"></a>输入</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#存放列表</span></span><br><span class="line">a=[]</span><br><span class="line"></span><br><span class="line"><span class="comment">#整数</span></span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> input().split():</span><br><span class="line">    a.append(int(x))</span><br><span class="line"></span><br><span class="line"><span class="comment">#浮点数</span></span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> input().split():</span><br><span class="line">    a.append(float(x))</span><br><span class="line">    </span><br><span class="line">    </span><br><span class="line"><span class="comment">#读</span></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'C:/Users/dongs/Desktop/qwer.txt'</span>, <span class="string">'r'</span>, encoding = <span class="string">'utf-8'</span>) <span class="keyword">as</span> cin:</span><br><span class="line">    L = cin.readlines()</span><br><span class="line">    <span class="keyword">for</span> lines <span class="keyword">in</span> L:</span><br><span class="line">        x = lines.split()[<span class="number">-1</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment">#写</span></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'C:/Users/dongs/Desktop/test.txt'</span>, <span class="string">'w'</span>, encoding = <span class="string">'utf-8'</span>) <span class="keyword">as</span> cout:</span><br><span class="line">    cout.write(<span class="string">'!'</span>)</span><br></pre></td></tr></table></figure><hr><h3 id="留坑"><a href="#留坑" class="headerlink" title="留坑"></a>留坑</h3><ul><li>尺取法</li><li>威佐夫</li><li>nim K</li><li>容斥原理</li><li>隔板法</li><li>斯特林数（第一类第二类）</li><li>矩阵快速幂</li><li>高斯消元</li><li>等价类计数</li><li>卡特兰数应用</li><li>Lucas定理</li><li>莫比乌斯反演</li><li>矩阵运算</li><li>矩阵快速幂</li><li>母函数</li><li>NTT</li><li>回文自动机</li><li>莫比乌斯 函数 反演</li><li>字典树</li><li>线段树</li><li>堆</li></ul><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">make_heap(v.begin(),v.end(), cmp);<span class="comment">//创建堆，无cmp时默认大根堆</span></span><br><span class="line">sort_heap(v.begin(),v.end());     <span class="comment">//堆排序</span></span><br><span class="line">push_heap(v.begin(),v.end());     <span class="comment">//先push一个元素到v的最后，再调用该函数</span></span><br><span class="line">pop_heap(v.begin(),v.end());      <span class="comment">//把堆顶元素和最后一个元素，然后维护堆，对顶元素仍可访问</span></span><br></pre></td></tr></table></figure><hr>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Leetcode/">Leetcode</category>
      
      <category domain="https://ry.huaji.store/tags/Some-Useful-Documents/">Some Useful Documents</category>
      
      
      <comments>https://ry.huaji.store/2023/04/Some-useful-documents-template/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>一些有用的文档：Git Tips</title>
      <link>https://ry.huaji.store/2023/04/Some-useful-documents-git-tips/</link>
      <guid>https://ry.huaji.store/2023/04/Some-useful-documents-git-tips/</guid>
      <pubDate>Sat, 22 Apr 2023 17:50:19 GMT</pubDate>
      
      <description>2019.7.1 Git Tips</description>
      
      
      
      <content:encoded><![CDATA[<p><a href="https://github.com/dongshunyao/some-useful-documents" target="_blank" rel="noopener">GitHub地址</a></p><p><em>2019.7.1</em></p><ul><li><a href="#git-tips">Git Tips</a><ul><li><a href="#概念">概念</a></li><li><a href="#working-directory-工作区">working directory 工作区</a></li><li><a href="#staging-area-暂存区">staging area 暂存区</a></li><li><a href="#repository-仓库">repository 仓库</a><ul><li><a href="#git目录">.git目录</a></li><li><a href="#gitignore文件">.gitignore文件</a></li></ul></li><li><a href="#remote-远程仓库">remote 远程仓库</a></li><li><a href="#branch-分支">branch 分支</a><ul><li><a href="#merge-合并">merge 合并</a><ul><li><a href="#普通合并">普通合并</a></li><li><a href="#fast-forward-merge-快进合并">fast-forward merge 快进合并</a></li></ul></li><li><a href="#合并冲突">合并冲突</a></li><li><a href="#删除分支">删除分支</a></li><li><a href="#pull-request-拉取请求合并请求">pull request 拉取请求（合并请求）</a></li></ul></li><li><a href="#commit-提交">commit 提交</a><ul><li><a href="#提交间隔">提交间隔</a></li><li><a href="#提交说明">提交说明</a></li><li><a href="#更改提交">更改提交</a><ul><li><a href="#更改说明">更改说明</a></li><li><a href="#向提交中添加忘记的文件">向提交中添加忘记的文件</a></li><li><a href="#rebase-变基">rebase 变基</a></li></ul></li><li><a href="#sha-提交id">SHA 提交ID</a></li><li><a href="#相关提交引用">相关提交引用</a></li></ul></li><li><a href="#常用命令">常用命令</a></li><li><a href="#参考">参考</a></li></ul></li></ul><hr><h3 id="概念"><a href="#概念" class="headerlink" title="概念"></a>概念</h3><p><strong><a href="https://github.com/dongshunyao/some-useful-documents/blob/main/Git%20Tips.md#%E6%A6%82%E5%BF%B5" target="_blank" rel="noopener">概念图请见Github</a></strong></p><hr><h3 id="working-directory-工作区"><a href="#working-directory-工作区" class="headerlink" title="working directory 工作区"></a>working directory 工作区</h3><p>简单来说就是你在计算机的文件系统中看到的文件</p><hr><h3 id="staging-area-暂存区"><a href="#staging-area-暂存区" class="headerlink" title="staging area 暂存区"></a>staging area 暂存区</h3><p>对文件的更改都会放到暂存区，一次提交后暂存区反映为提交，暂存区清空</p><hr><h3 id="repository-仓库"><a href="#repository-仓库" class="headerlink" title="repository 仓库"></a>repository 仓库</h3><p>存放文件的地方，会对该文件夹下的所有文件进行追踪</p><h4 id="git目录"><a href="#git目录" class="headerlink" title=".git目录"></a>.git目录</h4><ul><li><code>config</code> 文件：存储了所有与项目有关的配置设置，git 会查看你当前所使用仓库对应的配置文件<code>.git/config</code>中的配置值。这些值仅适用于当前仓库</li><li><code>description</code> 文件：此文件仅用于 GitWeb 程序</li><li><code>hooks</code> 目录：我们会在此处放置客户端或服务器端脚本，以便用来连接到 Git 的不同生命周期事件</li><li><code>info</code> 目录：包含全局排除文件</li><li><code>objects</code> 目录：此目录将存储我们提交的所有提交</li><li><code>refs</code> 目录：此目录存储了指向提交的指针（通常是“分支”和“标签”）</li></ul><h4 id="gitignore文件"><a href="#gitignore文件" class="headerlink" title=".gitignore文件"></a>.gitignore文件</h4><p>记录需要被git忽略的文件，可以对此文件进行文件管理</p><hr><h3 id="remote-远程仓库"><a href="#remote-远程仓库" class="headerlink" title="remote 远程仓库"></a>remote 远程仓库</h3><p>仓库的服务器端，会在本地留有副本，fetch命令可以更新</p><hr><h3 id="branch-分支"><a href="#branch-分支" class="headerlink" title="branch 分支"></a>branch 分支</h3><p>一个版本的不同演化形成分支，<code>master</code>为主分支</p><p>分支会记录当前分支的父分支，log命令只会沿父分支进行展示，特定情况下会让部分提交无法访问，除非记录其ID</p><h4 id="merge-合并"><a href="#merge-合并" class="headerlink" title="merge 合并"></a>merge 合并</h4><h5 id="普通合并"><a href="#普通合并" class="headerlink" title="普通合并"></a>普通合并</h5><p>原分支：两个分支的父分支分离位置的提交</p><p>对两个分支进行合并，合并时无冲突，对于某个更改的最终状态：</p><ul><li>三个分支全部存在 –&gt; 存在</li><li>三个分支全部不存在 –&gt; 不存在</li><li>原分支与一个分支存在 –&gt; 不存在，在一个分支中进行了删除，另一分支未改变，最后应该删除</li><li>仅一个分支存在 –&gt; 存在，在一个分支中进行了增加，另一分支未改变，最后应该增加</li></ul><p>合并分支后的结果为新建的一个提交，其父分支为合并的两个分支</p><h5 id="fast-forward-merge-快进合并"><a href="#fast-forward-merge-快进合并" class="headerlink" title="fast-forward merge 快进合并"></a>fast-forward merge 快进合并</h5><p>合并一个提交与他的父提交（包含更上一级的）时，不会新建提交，会将二者更新到最新的那个的状态</p><p>要合并的分支必须位于检出分支前面。检出分支的指针将向前移动，指向另一分支所指向的同一提交</p><h4 id="合并冲突"><a href="#合并冲突" class="headerlink" title="合并冲突"></a>合并冲突</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</span><br><span class="line">//此行下方的所有内容（直到下个指示符）显示了当前分支上的行</span><br><span class="line">||||||| merged common ancestors</span><br><span class="line">//此行下方的所有内容（直到下个指示符）显示了原始行的内容</span><br><span class="line">=======</span><br><span class="line">//表示原始行内容的结束位置，之后的所有行（直到下个指示符）是被合并的当前分支上的行的内容</span><br><span class="line">&gt;&gt;&gt;&gt;&gt;&gt;&gt; heading-update</span><br><span class="line">//是要被合并的分支（此例中是 heading-update 分支）上的行结束指示符</span><br></pre></td></tr></table></figure><p>解决冲突后应将文件重新添加到暂存区。并进行提交</p><h4 id="删除分支"><a href="#删除分支" class="headerlink" title="删除分支"></a>删除分支</h4><p>删除的只是标签，提交并不会删除，但只能通过ID进行访问</p><p>可以手动回收垃圾，即清除这些提交</p><h4 id="pull-request-拉取请求（合并请求）"><a href="#pull-request-拉取请求（合并请求）" class="headerlink" title="pull request 拉取请求（合并请求）"></a>pull request 拉取请求（合并请求）</h4><p>向管理者发出申请，将自己的分支合并到master主分支中</p><p>可以用于更新自己fork的仓库，即请求将原有仓库的提交合并至自己fork的仓库中。此外，这个问题也可以将原作者的仓库作为本地仓库的远程仓库，从中拉取数据，合并后推送至fork仓库以更新</p><hr><h3 id="commit-提交"><a href="#commit-提交" class="headerlink" title="commit 提交"></a>commit 提交</h3><p>基本操作，对仓库中所有文件创建新的版本</p><p>每次提交最好写明更改内容</p><p>每个提交有对应ID，使用时可以只输出前四个字符</p><h4 id="提交间隔"><a href="#提交间隔" class="headerlink" title="提交间隔"></a>提交间隔</h4><p>选择合适的时间间隔进行提交：<strong>为每项逻辑更改的更改进行一次提交</strong></p><p>例子：</p><ul><li>已经花了一周时间来开发一项新功能，现在你提交添加这项新功能所需的所有更改。从你开始开发它以来，你一直没有进行提交。<ul><li>此提交似乎过大。如果每个提交只做了一项工作并且比较小，则理解每个提交所做的工作会变得更容易。在一周内不进行任何提交并非上策。</li></ul></li><li>你在 README 中发现了三处打字错误。你改正并提交第一处错误。<ul><li>此提交似乎过小。改正所有三处打字错误后再一并提交会更好。这样一来，历史记录不会因打字错误的改正而变得过于混乱。此外，你无需担心会给 README 招致错误，因此，将更改捆绑在一起更可能会是一个好主意。</li></ul></li><li>你已经花了一小时来开发一项新功能，现在，你提交添加这项新功能所需的所有更改。<ul><li>这可能是大小适中的提交。所有工作均与一项功能有关，因此，提交的逻辑目的很清晰。一小时后，可能累积了相当多的内容，但并未多到无法理解。</li><li>另一方面，有时在工作了一小时后，你将会遇到一个以上的自然提交点，这时你会想将功能分解为多个较小的提交。因此，“过大”在这里也可能是一个合理的回答。</li></ul></li><li>你改正了不同函数中的两个小错误，然后同时提交两者。<ul><li>此提交可能过大。在改正第一个错误后提交将会更好，因为这两个错误的改正互不相关。</li></ul></li></ul><p><strong>重点：每个提交都应具有一个清晰的逻辑目的，而且绝不应在不进行提交的情况下完成过多工作</strong></p><h4 id="提交说明"><a href="#提交说明" class="headerlink" title="提交说明"></a>提交说明</h4><p><strong>保持一致性!</strong></p><p>建议：</p><ul><li>消息篇幅简短（少于 60 个字符）</li><li>解释提交的作用（不是如何更改或为何更改！）</li></ul><p>禁忌：</p><ul><li>请勿解释为何做出了这些更改</li><li>请勿解释如何进行了更改</li><li>请勿使用单词”and”</li><li>如果你必须使用 “and”，则你的提交说明可能进行了太多的更改，将这些更改拆分为独立的提交</li><li>例如 “make the background color pink and increase the size of the sidebar”</li></ul><h4 id="更改提交"><a href="#更改提交" class="headerlink" title="更改提交"></a>更改提交</h4><h5 id="更改说明"><a href="#更改说明" class="headerlink" title="更改说明"></a>更改说明</h5><p><code>git commit --amend</code> 可直接更改提交说明</p><h5 id="向提交中添加忘记的文件"><a href="#向提交中添加忘记的文件" class="headerlink" title="向提交中添加忘记的文件"></a>向提交中添加忘记的文件</h5><p>步骤：</p><ol><li>编辑文件</li><li>保存文件</li><li>暂存文件</li><li>运行 <code>git commit --amend</code></li></ol><h5 id="rebase-变基"><a href="#rebase-变基" class="headerlink" title="rebase 变基"></a>rebase 变基</h5><p><code>git rebase -i HEAD~?</code>  要操作几个提交，？处的数字就是几</p><p>对多个提交同时操作，可以用于合并多个提交</p><p>提交按从上到下更新排列</p><p>编辑指令：</p><ul><li><code>pick</code>：使提交保持原样（缩写 <code>p</code>）</li><li><code>reword</code>：保留该提交，但我需要修改该提交的注释（缩写 <code>r</code>）</li><li><code>edit</code>：保留该提交, 但先不提交，以便修改（缩写 <code>e</code>）</li><li><code>squash</code>：将此提交的更改结合到之前的提交（列表中位于其上面的提交）（缩写 <code>s</code>）</li><li><code>fixup</code>： 将此提交的更改结合到前一个提交中，但删除提交说明（缩写 <code>f</code>）</li><li><code>exec</code>：执行shell命令（缩写 <code>x</code>）</li><li><code>drop</code>：删除提交（缩写 <code>d</code>）</li></ul><h4 id="SHA-提交ID"><a href="#SHA-提交ID" class="headerlink" title="SHA 提交ID"></a>SHA 提交ID</h4><p>SHA 是每个提交的ID编号，它是一个长40个字符的字符（由0–9和a–f组成），并根据 Git 中的文件或目录结构的内容计算得出。SHA 的全称是”Secure Hash Algorithm”（安全哈希算法）</p><h4 id="相关提交引用"><a href="#相关提交引用" class="headerlink" title="相关提交引用"></a>相关提交引用</h4><p><code>^</code> 表示父提交</p><p><code>~</code> 表示第一个父提交</p><p>我们可以通过以下方式引用之前的提交：</p><ul><li>父提交，以下内容表示当前提交的父提交<ul><li><code>HEAD^</code></li><li><code>HEAD~</code></li><li><code>HEAD~1</code></li></ul></li><li>祖父提交，以下内容表示当前提交的祖父提交<ul><li><code>HEAD^^</code></li><li><code>HEAD~2</code></li></ul></li><li>曾祖父提交，以下内容表示当前提交的曾祖父提交<ul><li><code>HEAD^^^</code></li><li><code>HEAD~3</code></li></ul></li></ul><p><code>^</code> 和 <code>~</code> 的区别主要体现在通过合并而创建的提交中。合并的提交具有两个父级，<code>^</code> 引用用来表示第一个父提交，而 <code>^2</code> 表示第二个父提交。第一个父提交是当你运行 <code>git merge</code> 时所处的分支，而第二个父提交是被合并的分支。</p><p>例子：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">* 9ec05ca (HEAD -&gt; master) Revert <span class="string">"Set page heading to "</span>Quests &amp; Crusades<span class="string">""</span></span><br><span class="line">* db7e87a Set page heading to <span class="string">"Quests &amp; Crusades"</span></span><br><span class="line">*   796ddb0 Merge branch <span class="string">'heading-update'</span></span><br><span class="line">|\  </span><br><span class="line">| * 4c9749e (heading-update) Set page heading to <span class="string">"Crusade"</span></span><br><span class="line">* | 0c5975a Set page heading to <span class="string">"Quest"</span></span><br><span class="line">|/  </span><br><span class="line">*   1a56a81 Merge branch <span class="string">'sidebar'</span></span><br><span class="line">|\  </span><br><span class="line">| * f69811c (sidebar) Update sidebar with favorite movie</span><br><span class="line">| * e6c65a6 Add new sidebar content</span><br><span class="line">* | e014d91 (footer) Add links to social media</span><br><span class="line">* | 209752a Improve site heading <span class="keyword">for</span> SEO</span><br><span class="line">* | 3772ab1 Set background color <span class="keyword">for</span> page</span><br><span class="line">|/  </span><br><span class="line">* 5bfe5e7 Add starting HTML structure</span><br><span class="line">* 6fa5f34 Add .gitignore file</span><br><span class="line">* a879849 Add header to blog</span><br><span class="line">* 94de470 Initial commit</span><br><span class="line"></span><br><span class="line">因为HEAD 指向 9ec05ca commit：</span><br><span class="line"></span><br><span class="line">HEAD^ 是 db7e87a commit</span><br><span class="line">HEAD~1 是 db7e87a commit</span><br><span class="line"></span><br><span class="line">HEAD^^ 是 796ddb0 commit</span><br><span class="line">HEAD~2 是 796ddb0 commit</span><br><span class="line"></span><br><span class="line">HEAD^^^ 是 0c5975a commit</span><br><span class="line">HEAD~3 是 0c5975a commit</span><br><span class="line"></span><br><span class="line">HEAD^^^2 是 4c9749e commit（这是曾祖父的 (HEAD^^) 第二个父 commit (^2))</span><br></pre></td></tr></table></figure><hr><h3 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br></pre></td><td class="code"><pre><span class="line">git config --list                  //显示设置信息</span><br><span class="line">git <span class="built_in">log</span>                            //查看日志，可以按q退出</span><br><span class="line">git <span class="built_in">log</span> --all                      //查看所有分支的日志</span><br><span class="line">git <span class="built_in">log</span> --<span class="built_in">stat</span>                     //查看日志与更改量的统计数据，行为单位</span><br><span class="line">git <span class="built_in">log</span> --graph --oneline branchname1 branchname2 ...</span><br><span class="line">//可视化并简洁显示分支情况</span><br><span class="line">git <span class="built_in">log</span> --patch                    //查看日志，显示文件的实际更改</span><br><span class="line">git <span class="built_in">log</span> -p                         //同上</span><br><span class="line">git <span class="built_in">log</span> -p -w                      //同上，并忽略空格更改</span><br><span class="line">git <span class="built_in">log</span> -p commit                  //同-p，从指定提交开始</span><br><span class="line">git show commit                    //比较该提交与其父提交</span><br><span class="line">git diff                           //比较工作区和暂存区</span><br><span class="line">git diff --staged                  //比较暂存区和HEAD</span><br><span class="line">git diff commit_old commit2_new    //比较两次提交，参数为提交ID</span><br><span class="line">git --version                      //查看版本</span><br><span class="line">git <span class="built_in">clone</span> URL repositoryname       //克隆仓库</span><br><span class="line">git config --global color.ui auto  //让文字有色彩</span><br><span class="line">git tag                            //显示所有标签</span><br><span class="line">git tag -d <span class="string">"message"</span>               //删除标签</span><br><span class="line">git tag <span class="string">"message"</span>                  //加轻量级标签</span><br><span class="line">git tag <span class="string">"message"</span> commit           //给指定提交加标签</span><br><span class="line">git tag -a <span class="string">"message"</span>               //加带注释的标签</span><br><span class="line">git checkout commit                //检出，即回滚至指定提交</span><br><span class="line">git checkout branchname            //检出，即切换至指定分支</span><br><span class="line">git checkout -b branchname         //新建分支并检出</span><br><span class="line">git checkout -- file               //放弃工作区修改</span><br><span class="line">git init                           //将当前目录初始化为仓库</span><br><span class="line">git status                         //显示工作目录和暂存区的状态</span><br><span class="line">git add filename1 filename2 ...    //添加文件到暂存区</span><br><span class="line">git reset filename1 filename2 ...  //从暂存区删除文件</span><br><span class="line">git reset --hard                   //清空暂存区</span><br><span class="line">git reset commit                   //取消提交并清空暂存区，但工作区保留更改</span><br><span class="line">git reset --soft commit            //取消提交并将提交退回至暂存区</span><br><span class="line">git reset --hard commit            //取消提交，清除所有更改，包括工作区</span><br><span class="line">git revert commit                  //还原提交</span><br><span class="line">//此命令将通过创建一个新的提交来记录撤消目标提交，之前的保留</span><br><span class="line">git commit -m <span class="string">"message"</span>            //提交</span><br><span class="line">git commit --amend                 //更改提交说明，详见上文</span><br><span class="line">git branch                         //显示所有分支，*为当前状态</span><br><span class="line">git branch branchname              //新建分支</span><br><span class="line">git branch branchname commit       //创建分支并指向指定提交</span><br><span class="line">git branch -d branchname           //删除分支</span><br><span class="line">git gc                             //垃圾回收，慎用</span><br><span class="line">git merge branchname2 branchname3 ... </span><br><span class="line">//合并分支到当前分支，并在当前分支创建新的提交</span><br><span class="line">git remote                         //查看远程仓库</span><br><span class="line">git remote -v                      //查看远程仓库，并详细输出</span><br><span class="line">git remote add remotename URL      //与远程仓库建立链接，推荐用origin命名</span><br><span class="line">git push remotename branchname     //推送至远程仓库</span><br><span class="line">git pull remotename branchname     //从远程仓库拉取，并合并至当前分支</span><br><span class="line">//若远程仓库与本地存在冲突，则次命令无效，需要fetch后进行本地合并与推送</span><br><span class="line">git fetch                          //更新远程仓库的本地版本</span><br><span class="line">git shortlog                       //查看每个用户的提交，按人名字母顺序排列</span><br><span class="line">git shortlog -s -n                 //查看每个用户提交数量并按此排序</span><br><span class="line">git <span class="built_in">log</span> --author=<span class="string">"name"</span>            //按作者筛选提交</span><br><span class="line">git <span class="built_in">log</span> --grep=<span class="string">"message"</span>           //按提交信息的关键词筛选</span><br><span class="line">git rebase -i HEAD~?               //要操作几个提交，？处的数字就是几</span><br><span class="line">git stash                          //暂存当前工作状态，并重置</span><br><span class="line">git stash list                     //查看暂存</span><br><span class="line">git stash apply                    //恢复暂存</span><br><span class="line">git stash pop                      //恢复暂存并清除暂存</span><br><span class="line">git stash drop                     //清除暂存</span><br><span class="line">git check-ignore                   //检查忽略文件</span><br><span class="line"></span><br><span class="line">git <span class="built_in">log</span> --oneline | wc -l          //统计总提交次数</span><br></pre></td></tr></table></figure><hr><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><p><a href="https://github.com/521xueweihan/git-tips" target="_blank" rel="noopener">git-tips</a></p><p><a href="http://gitbook.liuhui998.com/index.html" target="_blank" rel="noopener">Git Community Book</a></p><p><a href="https://git-scm.com/book/zh/v2/" target="_blank" rel="noopener">Pro Git</a></p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Some-Useful-Documents/">Some Useful Documents</category>
      
      
      <comments>https://ry.huaji.store/2023/04/Some-useful-documents-git-tips/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>一些有用的文档：Qt Tips</title>
      <link>https://ry.huaji.store/2023/04/Some-useful-documents-qt-tips/</link>
      <guid>https://ry.huaji.store/2023/04/Some-useful-documents-qt-tips/</guid>
      <pubDate>Sat, 22 Apr 2023 17:46:34 GMT</pubDate>
      
      <description>2019.4.10 感谢郑老师和周巨佬的大力滋兹，Orz%%%</description>
      
      
      
      <content:encoded><![CDATA[<p><a href="https://github.com/dongshunyao/some-useful-documents" target="_blank" rel="noopener">GitHub地址</a></p><p><em>2019.4.10</em></p><p><strong>感谢郑老师和周巨佬的大力滋兹，Orz%%%</strong></p><ul><li><a href="#qt-tips">Qt Tips</a><ul><li><a href="#字符">字符</a></li><li><a href="#槽函数">槽函数</a></li><li><a href="#非阻塞式延迟">非阻塞式延迟</a></li><li><a href="#gui">GUI</a></li><li><a href="#文件资源管理器">文件资源管理器</a></li></ul></li></ul><hr><h3 id="字符"><a href="#字符" class="headerlink" title="字符"></a>字符</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 在头文件中加入以防止乱码</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> WIN32 </span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> execution_character_set(<span class="meta-string">"utf-8"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 编码转换</span></span><br><span class="line">QString s;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> code = QTextCodec::codecForName(<span class="string">"GB2312"</span>);</span><br><span class="line"><span class="built_in">string</span> ss = code-&gt;fromUnicode(s).data();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 将数字转换为字符串</span></span><br><span class="line">QString::number(number);</span><br></pre></td></tr></table></figure><hr><h3 id="槽函数"><a href="#槽函数" class="headerlink" title="槽函数"></a>槽函数</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 槽函数自动连接控件</span></span><br><span class="line"><span class="keyword">private</span> slots:</span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">on_button_clicked</span><span class="params">()</span></span>;</span><br><span class="line"><span class="comment">// button为控件名字，clicked为单击事件，自动连接</span></span><br><span class="line"></span><br><span class="line">connect(Sender, SIGNAL(signal), Receiver, SLOT(slot));</span><br><span class="line"><span class="comment">// 使用宏：Sender为发送信号的控件名，Receiver为接收信号的对象名，signal为信号，slot为执行的槽函数</span></span><br><span class="line"></span><br><span class="line">connect(test_button, &amp;QPushButton::clicked, <span class="keyword">this</span>, &amp;test_window::test_slot);</span><br><span class="line"><span class="comment">// 使用指针：test_button为发送信号的控件名，this为接收信号的对象名，&amp;QPushButton::clicked为信号的指针，这里是按钮单击，&amp;test_window::test_slot为执行的槽函数的指针</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 上面的方法槽函数里不能有参数，有参数可以用lambda表达式实现</span></span><br><span class="line">connect(test_button, &amp;QPushButton::clicked, <span class="keyword">this</span>, [=] &#123; test_slot(); &#125;);</span><br></pre></td></tr></table></figure><hr><h3 id="非阻塞式延迟"><a href="#非阻塞式延迟" class="headerlink" title="非阻塞式延迟"></a>非阻塞式延迟</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">delay</span><span class="params">(<span class="keyword">const</span> <span class="keyword">int</span> seconds)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">const</span> <span class="keyword">auto</span> reach_time = QTime::currentTime().addSecs(seconds);</span><br><span class="line">    <span class="keyword">while</span> (QTime::currentTime() &lt; reach_time) QCoreApplication::processEvents(QEventLoop::AllEvents, <span class="number">100</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h3 id="GUI"><a href="#GUI" class="headerlink" title="GUI"></a>GUI</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 样式表指定范围</span></span><br><span class="line">类名#对象名</span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// 指定对象，指定该对象实例，对于所有符合条件的设置</span></span><br><span class="line">    <span class="comment">// 类名和对象名不写则通配</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 固定大小</span></span><br><span class="line">setMinimumSize(<span class="number">100</span>, <span class="number">100</span>);</span><br><span class="line">setMaximumSize(<span class="number">100</span>, <span class="number">100</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 设置透明</span></span><br><span class="line">setFlat(<span class="literal">true</span>);</span><br><span class="line"><span class="comment">// 样式表设置透明</span></span><br><span class="line">background-color: rgba(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 样式表设置文字颜色</span></span><br><span class="line">color:rgb(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// QMainiWindow设置背景</span></span><br><span class="line">#centralWidget&#123;border-image:url(:/image/Resources/background.jpg);&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 设置窗口关闭自动释放对象</span></span><br><span class="line">setAttribute(Qt::WA_DeleteOnClose, <span class="literal">true</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 设置窗口为模态</span></span><br><span class="line">setWindowModality(Qt::ApplicationModal);</span><br></pre></td></tr></table></figure><hr><h3 id="文件资源管理器"><a href="#文件资源管理器" class="headerlink" title="文件资源管理器"></a>文件资源管理器</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 打开并选中文件</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">open_file_browser</span><span class="params">(QString url)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    url.replace(<span class="string">"/"</span>, <span class="string">"\\"</span>);</span><br><span class="line">    QProcess::startDetached(QString(<span class="string">"explorer.exe /select,\"%1\""</span>).arg(url));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 打开目录</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">open_file_browser</span><span class="params">(QString url)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    url.replace(<span class="string">"/"</span>, <span class="string">"\\"</span>);</span><br><span class="line">    QProcess::startDetached(QString(<span class="string">"explorer.exe \"%1\""</span>).arg(url));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 取项目路径</span></span><br><span class="line">QDir::currentPath();</span><br></pre></td></tr></table></figure>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Some-Useful-Documents/">Some Useful Documents</category>
      
      
      <comments>https://ry.huaji.store/2023/04/Some-useful-documents-qt-tips/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>一些有用的文档：多线程从入门到入土</title>
      <link>https://ry.huaji.store/2023/04/Some-useful-documents-thread/</link>
      <guid>https://ry.huaji.store/2023/04/Some-useful-documents-thread/</guid>
      <pubDate>Sat, 22 Apr 2023 17:38:43 GMT</pubDate>
      
      <description>2018.11.21 郑老师TQL</description>
      
      
      
      <content:encoded><![CDATA[<p><a href="https://github.com/dongshunyao/some-useful-documents" target="_blank" rel="noopener">GitHub地址</a></p><p><em>2018.11.21</em></p><p><strong>郑老师TQL</strong></p><ul><li><a href="#多线程从入门到入土">多线程从入门到入土</a><ul><li><a href="#什么是线程">什么是线程</a></li><li><a href="#如何实现线程的运行和停止">如何实现线程的运行和停止</a><ul><li><a href="#0引用相关头文件">0.引用相关头文件</a></li><li><a href="#1编写线程函数">1.编写线程函数</a></li><li><a href="#2建立线程">2.建立线程</a></li><li><a href="#3终止线程">3.终止线程</a></li></ul></li><li><a href="#实例">实例</a></li></ul></li></ul><h3 id="什么是线程"><a href="#什么是线程" class="headerlink" title="什么是线程"></a>什么是线程</h3><p>将人比作一个进程，那么人可以边吃饭边玩手机，“吃饭” 和 “玩手机” 则为两个线程，线程可以同时执行，不分先后。</p><h3 id="如何实现线程的运行和停止"><a href="#如何实现线程的运行和停止" class="headerlink" title="如何实现线程的运行和停止"></a>如何实现线程的运行和停止</h3><p>简单的线程如下：</p><h4 id="0-引用相关头文件"><a href="#0-引用相关头文件" class="headerlink" title="0.引用相关头文件"></a>0.引用相关头文件</h4><p><code>#include &lt;pthread.h&gt;</code></p><p>同时注意编译的时候要加入 <code>-lpthread</code> 参数来引用多线程库</p><h4 id="1-编写线程函数"><a href="#1-编写线程函数" class="headerlink" title="1.编写线程函数"></a>1.编写线程函数</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">thread_testfunc</span><span class="params">()</span></span>&#123;</span><br><span class="line">    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, <span class="literal">NULL</span>);<span class="comment">//允许取消线程</span></span><br><span class="line">    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, <span class="literal">NULL</span>);<span class="comment">//取消方式:立即结束线程</span></span><br><span class="line">    <span class="comment">//在此处写线程运行的代码</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>函数返回时线程消亡</p><p>在本例中，我们的线程需要持续反复一段代码，因此可在代码外部添加<code>for (;;) {}</code>来达到此目的，如下</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">thread_testfunc</span><span class="params">()</span></span>&#123;</span><br><span class="line">    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, <span class="literal">NULL</span>);<span class="comment">//允许取消线程</span></span><br><span class="line">    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, <span class="literal">NULL</span>);<span class="comment">//取消方式立即结束线程</span></span><br><span class="line">    <span class="keyword">for</span>(;;)&#123;</span><br><span class="line">        <span class="comment">//需要反复执行的的逻辑</span></span><br><span class="line">        <span class="comment">//例如：根据某变量控制鸣笛频率，车辆状态等</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-建立线程"><a href="#2-建立线程" class="headerlink" title="2.建立线程"></a>2.建立线程</h4><p>线程标识符TID就像线程的名字，在线程创建时返回，用于线程的终止等操作。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">pthread_t</span> tth;</span><br><span class="line">pthread_create(&amp;tth, <span class="literal">NULL</span>, (<span class="keyword">void</span> *)&amp; thread_testfunc, <span class="literal">NULL</span>);</span><br></pre></td></tr></table></figure><p>以上两条指令创建了一个线程来执行<code>thread_testfunc</code>函数，并将它的<code>TID</code>放到了变量<code>tth</code>中。</p><h4 id="3-终止线程"><a href="#3-终止线程" class="headerlink" title="3.终止线程"></a>3.终止线程</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pthread_cancel(tth);</span><br></pre></td></tr></table></figure><p>以上指令终止了<code>TID</code>为<code>tth</code>的线程。</p><h3 id="实例"><a href="#实例" class="headerlink" title="实例"></a>实例</h3><p>本程序实现了通过输入时间间隔控制响铃快慢的多线程实现</p><p>为了方便理解和测试，采用了单文件</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">编译： gcc ring.c -o ring.exe -lwiringPi -lpthread</span></span><br><span class="line"><span class="comment">程序描述: 报警的急促和缓慢的多线程控制。</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;wiringPi.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;pthread.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;softTone.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> BuzPin 0</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">root_init</span><span class="params">()</span></span>;<span class="comment">//总初始化</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ring_init</span><span class="params">()</span></span>;<span class="comment">//响铃初始化</span></span><br><span class="line"><span class="function"><span class="keyword">pthread_t</span> <span class="title">new_ring_task</span><span class="params">()</span></span>;<span class="comment">//创建响铃线程</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ring_task</span><span class="params">()</span></span>;<span class="comment">//响铃线程原函数</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> delay_time = <span class="number">100</span>;<span class="comment">//响铃延迟</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">void</span>)</span></span>&#123;</span><br><span class="line"></span><br><span class="line">    root_init();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">pthread_t</span> tid = new_ring_task();<span class="comment">//创建响铃线程</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span>(;;)&#123;<span class="comment">//响铃线程和本for同时运行，所以输入的数会实时影响响铃</span></span><br><span class="line">        <span class="keyword">int</span> tmp;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"Enter New delay_time(10~2000):(-1 to exit)"</span>);</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;tmp);</span><br><span class="line">        fflush(<span class="built_in">stdin</span>);</span><br><span class="line">        <span class="keyword">if</span>(tmp == <span class="number">-1</span>)<span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">if</span>(tmp&lt;<span class="number">10</span>) tmp = <span class="number">10</span>;</span><br><span class="line">        <span class="keyword">if</span>(tmp&gt;<span class="number">2000</span>) tmp = <span class="number">2000</span>;</span><br><span class="line">        delay_time = tmp;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    pthread_cancel(tid);<span class="comment">//结束响铃进程</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">root_init</span><span class="params">()</span></span>&#123;</span><br><span class="line">    wiringPiSetup();</span><br><span class="line">    ring_init();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ring_init</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="built_in">pinMode</span>(BuzPin, <span class="literal">OUTPUT</span>);</span><br><span class="line">    softToneCreate(BuzPin);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">pthread_t</span> <span class="title">new_ring_task</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="keyword">pthread_t</span> ring_thread;</span><br><span class="line">    pthread_create(&amp;ring_thread, <span class="literal">NULL</span>, (<span class="keyword">void</span> *)&amp;ring_task, <span class="literal">NULL</span>);</span><br><span class="line">    <span class="keyword">return</span> ring_thread;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ring_task</span><span class="params">()</span></span>&#123;</span><br><span class="line">    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, <span class="literal">NULL</span>);<span class="comment">//允许取消线程</span></span><br><span class="line">    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, <span class="literal">NULL</span>);<span class="comment">//取消时立即结束线程</span></span><br><span class="line">    <span class="keyword">for</span>(;;)&#123;</span><br><span class="line">        softToneWrite(BuzPin, <span class="number">1000</span>);</span><br><span class="line">        <span class="built_in">delay</span>(delay_time);</span><br><span class="line">        softToneWrite(BuzPin, <span class="number">0</span>);</span><br><span class="line">        <span class="built_in">delay</span>(delay_time);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Some-Useful-Documents/">Some Useful Documents</category>
      
      
      <comments>https://ry.huaji.store/2023/04/Some-useful-documents-thread/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>すずめの戸締まり / 铃芽之旅 / 铃芽户缔 / 你的门子</title>
      <link>https://ry.huaji.store/2023/04/Suzume/</link>
      <guid>https://ry.huaji.store/2023/04/Suzume/</guid>
      <pubDate>Thu, 06 Apr 2023 19:12:48 GMT</pubDate>
      
      <description>说实话去看之前大家的评价两极分化，甚至是差评居多，但是看完之后我表示：“没有任何问题”</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="一"><a href="#一" class="headerlink" title="一"></a>一</h3><p>周三和 Ayako 去电影院看的 IMAX<br>一点小小的巨幕震撼<br>说实话去看之前大家的评价两极分化，甚至是差评居多<br>但是看完之后我表示<br>“没有任何问题”<br>就是不太懂为什么这几部诚哥都想给日本扬了（x</p><p>这部作品不免会和《你的名字》与《天气之子》比较<br>这一作明显是更加商业化的<br>可以说是妥协也可以说是成熟<br>（剧情和恋爱线这个样子据说也是制作委员会的压力？<br>相比三年前，能明显感受到诚哥被疫情影响不小<br>三年前《天子之子》重拳出击<br>三年后《铃芽之旅》唯唯诺诺<br>嘛，这也不是坏事<br>商业化并不是一件容易的事<br>他也呼应了大家的期待做出了一部公路片</p><hr><h3 id="二"><a href="#二" class="headerlink" title="二"></a>二</h3><p>不得不说诚哥这三部电影遥相呼应了我三个人生阶段<br>五十岁的人能写出二十岁人的内心与现实确实不容易</p><p>《你的名字》是高中那会儿<br>喜欢的是电影<br>喜欢的是动画<br>喜欢的是这个作品本身<br>那会儿没太多要思考的，也无须多想</p><p>《天气之子》是大学那会儿<br>喜欢的是故事<br>喜欢的是结局<br>喜欢的是宁可牺牲一切也要拯救自己爱的人的勇气<br>毁掉所有只为留在你身边的魄力<br>那会儿觉得自己牛逼完了，一切困难和问题都不是事儿<br>冲就完事了，无须担心后果和失败</p><p>《铃芽之旅》是工作之后<br>经历的疫情<br>经历了换工作<br>经历了社会毒打<br>人也变了，心也变了，锐气也没了<br>没那么多信心了，想的事情也变多了<br>以至于会被人说想太多活太累了<br>现在喜欢的是什么？<br>喜欢的是这 122 分钟能沉浸的在电影院感受这趟旅程<br>喜欢的是走出电影院时的恍如隔世<br>喜欢的是在主人公身上看到了类似的问题但最后圆满解决 Happy Ending<br>说白了你能在仅有的一天假期里花几十块钱<br>在电影院里抛开一切享受两个小时纯粹的青春恋爱物语的滋润<br>已经是二次元福报了</p><hr><h3 id="三"><a href="#三" class="headerlink" title="三"></a>三</h3><p>说剧情拉的<br>诚哥这么多年的动画本来就没什么故事<br>一向是小而美的<br>其实故事看一半就能猜出后续走向和结局<br>但这不重要<br>你来看也不是奔着故事来的，是吧？<br>要什么自行车</p><p>说姨妈线冲突、感情和灾祸莫名其妙的<br>初闻不识曲中意<br>再听已是曲中人<br>还好故事的最后都完美解决了<br>毕竟我是来找乐子不是来照镜子的<br>不过换句话说我其实也挺期待留下点痕迹的<br>前两部或多或少在结局时带了点遗憾的<br>这一部太圆满了，太温柔了<br>已经有些不真实了<br>可能诚哥心也变了吧</p><p>不得不提的是这次的节奏感十分的好<br>张弛有度，精准把握<br>两个小时的神话冒险公路片<br>已经很不错了<br>人追椅追猫的公路片多有意思啊<br>如诚哥所言<br>“我们竭尽创作了一部两小时毫无尿点的娱乐作品”</p><p>看完在想那个椅子到底是什么时候瘸的<br>完全没有交代<br>最后反应过来了这个椅子只出现在循环之中<br>循环变量属于是了</p><p>有人会讲男女主的恋爱线莫名其妙的<br>说女主就一活脱脱恋爱脑<br>我回忆了一下前两部我都是代入男主<br>这次是代入女主<br>换我的话只得是有过之而无不及<br>这谁顶得住啊<br>你觉得是一见钟情<br>然则已经命中注定</p><p>有人会讲猫猫大臣就是一舔狗<br>其实应该说他只是个小孩子<br>会因为一句话去喜欢铃芽调皮捣蛋求贴贴<br>被骂被讨厌的时候自责难过默默离开<br>最后才会代偿似的替铃芽成为要石<br>这个也呼应了铃芽和环姨妈的之间的关系</p><hr><h3 id="四"><a href="#四" class="headerlink" title="四"></a>四</h3><p>看到铃芽与曾经的自己在常世中相见时<br>我心里激起了不小的涟漪<br>特别是这句话，一波震撼<br>“不管现在有多悲伤，你都会长大的，所以不要害怕未来，你在今后会很喜欢某个人，也会遇到很多喜欢你的人。”<br>给小铃芽，也是给观众<br>一剂爱与希望的强心针<br>抚慰人们的心灵</p><p>“作为一种娱乐”<br>“我们制作了一部真正令人愉快的电影”<br>“如果你能把正面的情绪带回家”<br>“那么我们就能找到在这个国家制作电影的意义”<br>感谢！再会！</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E5%8A%A8%E7%94%BB/">动画</category>
      
      
      <comments>https://ry.huaji.store/2023/04/Suzume/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>从中古 CD 到 Vocaloid</title>
      <link>https://ry.huaji.store/2023/02/Vocaloid-CD/</link>
      <guid>https://ry.huaji.store/2023/02/Vocaloid-CD/</guid>
      <pubDate>Sun, 05 Feb 2023 14:19:11 GMT</pubDate>
      
      <description>准备买点中古CD，挑了好久挑出来三四十张，顺带对VOCALOID和各位P主有了全新的认识</description>
      
      
      
      <content:encoded><![CDATA[<p>准备买点中古CD<br>挑了好久挑出来三四十张<br>顺带对VOCALOID和各位P主有了全新的认识</p><p>“老匹原来没这么火啊？当年听的时候还是万年老二，翻身了啊”<br>“电音P子王八你给点力啊”<br>“DECO这两年曲子不行了啊”<br>“原来春卷饭是男的啊”<br>“原来这几个都是gigaP和Junky的曲子啊”<br>“八爷的曲子还是现在的好听”<br>“还得是奶油糖”<br>“油管上播放量最高的中文VOCALOID居然是心华”<br>“喜欢的基本上都是传说曲，还挺符合大众口味的”<br>“大多数都是14到19年的曲子啊”<br>“镜音的还不少”<br>“好多喜欢的曲子全在历年的魔法未来，20年之前的嫌贵都没买，血亏”<br>“第一次知道Masked bitcH的全名，还以为后面原本就是星号，网易云害人不浅”<br>“好久没听到过威风堂堂了，原来是被国内Ban了”<br>“喜欢的好几个小P主的曲子都没专辑收，有个P主甚至推特才200粉”<br>“爬山P什么时候出新专啊，TOA也是”<br>“恭喜本周Rolling Girl和World is Mine晋升神话曲，缅怀一下wowaka”<br>“集齐了所有神话曲”<br>“Hand in Hand还真是难忘今宵”<br>“幽灵法则，狗斯特露露，神TM露露”<br>“Seyana怎么不出专辑啊”<br>“十年前的碟你卖这么贵怎么不去抢啊”<br>“才知道有连版本的RinChanNow”<br>“上一次听te-yut-te都是十多年前了”<br>“想太的专辑怎么标了个98年出版啊”<br>“稲葉曇最后一个字是原来是昙啊”<br>“vocadb比萌娘百科靠谱多了”<br>“回家老婆装死这个贴二创还挺多啊”<br>“神的随波逐流重置版还没原版好听”<br>“乐，你怎么流派也写VOCALOID”</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Vocaloid/">Vocaloid</category>
      
      <category domain="https://ry.huaji.store/tags/%E9%9F%B3%E4%B9%90/">音乐</category>
      
      
      <comments>https://ry.huaji.store/2023/02/Vocaloid-CD/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>《夏日花火》现已发售！</title>
      <link>https://ry.huaji.store/2022/10/Sparkling/</link>
      <guid>https://ry.huaji.store/2022/10/Sparkling/</guid>
      <pubDate>Fri, 28 Oct 2022 09:00:00 GMT</pubDate>
      
      <description>经过三年的“寒窗苦读”，参与制作的独立游戏《夏日花火》现已上架 Steam 商店！</description>
      
      
      
      <content:encoded><![CDATA[<p>经过三年的“寒窗苦读”，参与制作的独立游戏《夏日花火》现已上架 Steam 商店！</p><p>做游戏不易，求求朋友们多多支持！（快来 Steam 上点个关注加个愿望单吧Orz）</p><p><strong>Steam 商店页：<a href="https://store.steampowered.com/app/1787120" target="_blank" rel="noopener">https://store.steampowered.com/app/1787120</a></strong></p><p>感谢各位！愿《夏日花火》大卖！</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E5%A4%8F%E6%97%A5%E8%8A%B1%E7%81%AB/">夏日花火</category>
      
      
      <comments>https://ry.huaji.store/2022/10/Sparkling/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>曾经沧海难为水 除却巫山不是云</title>
      <link>https://ry.huaji.store/2021/05/RIP-LBH/</link>
      <guid>https://ry.huaji.store/2021/05/RIP-LBH/</guid>
      <pubDate>Thu, 13 May 2021 18:42:40 GMT</pubDate>
      
      <description>。</description>
      
      
      
      <content:encoded><![CDATA[<blockquote><p><strong>1997.5.20 - 2021.5.14</strong></p></blockquote><hr><blockquote><p><strong>See You Again (feat. Charlie Puth)</strong><br>Wiz Khalifa<br><em>Furious 7</em></p></blockquote><p><audio controls src="/media/see_you_again.mp3"></audio></p><hr><blockquote><p><strong>Stay Alive</strong><br>José González<br><em>The Secret Life Of Walter Mitty</em></p></blockquote><p><audio controls src="/media/stay_alive.mp3"></audio></p><hr><blockquote><p><strong>你曾是少年</strong><br>S.H.E<br><em>Wings of My Words</em></p></blockquote><p><audio controls src="/media/wings_of_my_words.mp3"></audio></p><hr><blockquote><p><strong>夢醒時分</strong><br>陳淑樺<br><em>跟你說聽你說</em></p></blockquote><p><audio controls src="/media/dream_to_awakening.mp3"></audio></p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/R-I-P/">R.I.P.</category>
      
      
      <comments>https://ry.huaji.store/2021/05/RIP-LBH/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>让你的 Linux 云服务器也能科学上网！</title>
      <link>https://ry.huaji.store/2020/08/Linux-magic-network/</link>
      <guid>https://ry.huaji.store/2020/08/Linux-magic-network/</guid>
      <pubDate>Thu, 27 Aug 2020 11:53:18 GMT</pubDate>
      
      <description>注意：这篇文章不是教你怎么在云服务器上搭梯子本地翻墙，而是教你在没有 GUI 界面的 Linux 系统上使用梯子！</description>
      
      
      
      <content:encoded><![CDATA[<p><strong>注意：这篇文章不是教你怎么在云服务器上搭梯子本地翻墙，而是教你在没有 GUI 界面的 Linux 系统上使用梯子！</strong></p><p>之前遇到过一些 SB 需求，解决的唯一办法就是在 Linux 系统的云服务器用 Shadowsocks/V2ray/Clash 挂代理科学上网（GFW 真的很讨厌啊QAQ）。毕竟是云服务器，带 GUI 的梯子就不太好搞了（当然你可以参考我<a href="https://ry.huaji.store/2020/07/Linux-XServer">之前的文章</a>用 XServer 运行有 GUI 的科学上网软件）。这篇文章讲的就是在 Linux 上以命令行的方式科学上网</p><p>下面的教程将分别介绍 Shadowsocks/V2RayA/V2Ray/Clash 在 Ubuntu/CentOS 上的解决方案</p><p><strong>2024.3.26 最近经常有朋友发邮件来问，于是决定给文章整体翻修一下，还有问题的话欢迎邮件或者 Telegram 联系我（笑）</strong></p><p><strong>2024.4.8 有朋友私信我推荐了 V2RayA 这个客户端，相关教程已经更新，感谢 @QZPM3333汉 的鼎力支持！好人一生平安！</strong></p><p><strong>2024.12.3 结合大家的反馈更新一些细节和措辞</strong></p><hr><h3 id="Shadowsocks"><a href="#Shadowsocks" class="headerlink" title="Shadowsocks"></a>Shadowsocks</h3><h4 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h4><p>安装很简单，你可以直接用 <code>pip3</code> 搞定</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pip3 install https://github.com/shadowsocks/shadowsocks/archive/master.zip -U</span><br></pre></td></tr></table></figure><p>或者</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pip3 install shadowsocks</span><br></pre></td></tr></table></figure><p>此外，如果你需要使用 Shadowsocks 新的加密方式的话，比如 <code>Chacha20-Ietf-Poly1305</code>，你还需要装下面这个东西</p><blockquote><p>Ubuntu</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install libsodium-dev</span><br></pre></td></tr></table></figure><blockquote><p>CentOS</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo yum -y install epel-release</span><br><span class="line">sudo yum -y install libsodium</span><br></pre></td></tr></table></figure><h4 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h4><p>新建配置文件夹和配置文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo mkdir /etc/shadowsocks</span><br><span class="line">sudo vi /etc/shadowsocks/shadowsocks.json</span><br></pre></td></tr></table></figure><p>配置如下，具体内容自行修改<del>（没有梯子请自行联系工信部申请）</del></p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    <span class="attr">"server"</span>: <span class="string">"your_server_url"</span>,</span><br><span class="line">    <span class="attr">"server_port"</span>: <span class="number">23333</span>,</span><br><span class="line">    <span class="attr">"local_address"</span>: <span class="string">"127.0.0.1"</span>,</span><br><span class="line">    <span class="attr">"local_port"</span>: <span class="number">1080</span>,</span><br><span class="line">    <span class="attr">"password"</span>: <span class="string">"your_server_password"</span>,</span><br><span class="line">    <span class="attr">"timeout"</span>: <span class="number">60</span>,</span><br><span class="line">    <span class="attr">"method"</span>: <span class="string">"chacha20-ietf-poly1305"</span>,</span><br><span class="line">    <span class="attr">"workers"</span>: <span class="number">1</span>,</span><br><span class="line">    <span class="attr">"fast_open"</span>: <span class="literal">false</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>其中</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">server：科学上网代理提供商的 Shadowsocks 服务器地址</span><br><span class="line">server_port：科学上网代理提供商的 Shadowsocks 服务器端口</span><br><span class="line">local_address：本地 Sock5 代理地址</span><br><span class="line">local_port：本地 Sock5 代理端口</span><br><span class="line">password：科学上网代理提供商的 Shadowsocks 连接密码</span><br><span class="line">timeout：超时等待时间（秒）</span><br><span class="line">method：加密方式</span><br><span class="line">workers：工作线程数</span><br><span class="line">fast_open：TCP Fast Open，按需开启</span><br></pre></td></tr></table></figure><p>配置完成，之后就可以通过 <code>local_address</code> 和 <code>local_port</code> 走 Sock5 代理了</p><h4 id="启动脚本"><a href="#启动脚本" class="headerlink" title="启动脚本"></a>启动脚本</h4><p>创建启动脚本 <code>/etc/systemd/system/shadowsocks.service</code> </p><p>这里请确认你的 <code>sslocal</code> 的所在位置，自行修改脚本文件中的 <code>/usr/local/bin/sslocal</code>，<strong>位置不对启动服务时会报 203 错误</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description&#x3D;Shadowsocks</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">TimeoutStartSec&#x3D;0</span><br><span class="line">ExecStart&#x3D;&#x2F;usr&#x2F;local&#x2F;bin&#x2F;sslocal -c &#x2F;etc&#x2F;shadowsocks&#x2F;shadowsocks.json</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy&#x3D;multi-user.target</span><br></pre></td></tr></table></figure><h4 id="GO-GO-GO"><a href="#GO-GO-GO" class="headerlink" title="GO! GO! GO!"></a>GO! GO! GO!</h4><p>启动服务或者配置开机自启动</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 开机自启动</span></span><br><span class="line">sudo systemctl <span class="built_in">enable</span> shadowsocks.service</span><br><span class="line"><span class="comment"># 启动服务</span></span><br><span class="line">sudo systemctl start shadowsocks.service</span><br><span class="line"><span class="comment"># 查看状态</span></span><br><span class="line">sudo systemctl status shadowsocks.service</span><br><span class="line"><span class="comment"># 停止服务</span></span><br><span class="line">sudo systemctl stop shadowsocks.service</span><br></pre></td></tr></table></figure><p>测试一下，看看你的 ip 地址是否符合预期</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl --socks5 127.0.0.1:1080 https://httpbin.org/ip</span><br></pre></td></tr></table></figure><p>到这里 Shadowsocks 部分就结束了，可以直接跳转后面的 Sock5 代理部分接着搞</p><hr><h3 id="V2RayA"><a href="#V2RayA" class="headerlink" title="V2RayA"></a>V2RayA</h3><blockquote><p>感谢 @QZPM3333汉 的推荐！</p></blockquote><blockquote><p><a href="https://v2raya.org" target="_blank" rel="noopener">V2RayA</a><br>一个易用而强大的，跨平台的 V2Ray 客户端<br>使用 Golang 和 Vue.js 编写，运行时没有任何外部依赖库，可跨平台运行，借助任意一款浏览器均可操作<br>对于无图形界面的操作系统，在安装 V2RayA 之后，借助另一台 PC 或移动设备即可完成对其的操作，这对于远程服务器、路由器是极其方便的</p></blockquote><p>用这个客户端的好处是你只需要在服务器上运行它，然后打开它提供的 Web UI 就能完成配置工作了，图形化配置比直接命令行能方便不少</p><h4 id="安装-1"><a href="#安装-1" class="headerlink" title="安装"></a>安装</h4><p><del>选择你的英雄</del>选择对应系统的链接进行安装吧：<a href="https://v2raya.org/docs/prologue/installation" target="_blank" rel="noopener">这里</a></p><h4 id="配置-1"><a href="#配置-1" class="headerlink" title="配置"></a>配置</h4><p>没什么好配置的，安装的过程中该搞定的它都帮你搞定了，注意确认一下服务是不是启动了</p><p>我唯一能想到的坑就是安全组配置问题：如果你使用的是云服务商的云服务器，记得去安全组里把 Web UI 使用的端口放通，不然你没法在服务器外访问 Web UI，这里的默认端口是 2017</p><h4 id="GO-GO-GO-1"><a href="#GO-GO-GO-1" class="headerlink" title="GO! GO! GO!"></a>GO! GO! GO!</h4><p><del>〇神启动</del>照着这个来吧：<a href="https://v2raya.org/docs/prologue/quick-start" target="_blank" rel="noopener">快速上手</a></p><p>使用你的服务器地址和 Web UI 端口在浏览器中配置并使用吧！</p><p>V2RayA 默认开放以下代理端口：</p><ul><li>Sock5 20170</li><li>HTTP 20171</li><li>HTTP 带分流规则 20172</li></ul><p>你可以根据自身需求选择相应的代理方式。至于怎么配置代理嘛，请仔细地继续阅读本文XD</p><hr><h3 id="V2Ray"><a href="#V2Ray" class="headerlink" title="V2Ray"></a>V2Ray</h3><h4 id="安装-2"><a href="#安装-2" class="headerlink" title="安装"></a>安装</h4><p><strong>下面的脚本貌似废弃了，看看这个吧：<a href="https://guide.v2fly.org/prep/install.html#%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E8%A3%85" target="_blank" rel="noopener">这里</a></strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo su</span><br><span class="line">bash &lt;(curl -L -s https://install.direct/go.sh)</span><br></pre></td></tr></table></figure><h4 id="配置-2"><a href="#配置-2" class="headerlink" title="配置"></a>配置</h4><p>很抱歉，V2Ray 的配置文件太复杂了，我不会写。。。</p><p><strong>所以我把我 Windows 下用的 V2RayN 的配置文件 <code>config.json</code> 直接复制过来了XD</strong></p><p>复制前记得把该配置的东西都配置好，可以顺带把 PAC 加上</p><p>记得去看一下你的 Sock5 代理的端口和地址，我这里是 <code>127.0.0.1:10808</code></p><h4 id="GO-GO-GO-2"><a href="#GO-GO-GO-2" class="headerlink" title="GO! GO! GO!"></a>GO! GO! GO!</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启动服务</span></span><br><span class="line">sudo service v2ray start</span><br><span class="line"><span class="comment"># 查看状态</span></span><br><span class="line">sudo service v2ray status</span><br><span class="line"><span class="comment"># 停止服务</span></span><br><span class="line">sudo service v2ray stop</span><br></pre></td></tr></table></figure><p>当然你也可以测试一下，替换 Sock5 代理的端口和地址就行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl --socks5 127.0.0.1:10808 https://httpbin.org/ip</span><br></pre></td></tr></table></figure><p>后续工作也是继续搞 Sock5 代理</p><hr><h3 id="Clash"><a href="#Clash" class="headerlink" title="Clash"></a>Clash</h3><p>现在好多人都开始用 Clash 了<del>（我也是）</del>，这里概述一下，具体的还是建议阅读文档</p><p>然而前段时间相关作者都陆续删库跑路了，还挺令人猝不及防的</p><p>所以现在官方的文档和二进制文件都没了，<strong>至于第三方来源靠不靠谱有没有加魔法，那我就不好说了（出了问题别怪我（逃</strong></p><h4 id="安装-3"><a href="#安装-3" class="headerlink" title="安装"></a>安装</h4><p>万物始于 <a href="https://github.com/Dreamacro/clash/wiki#getting-started" target="_blank" rel="noopener">Getting Started</a></p><p><strong>当然上面这个链接寄了，搜了一下这个文档还不错：<a href="https://clash.wiki/introduction/getting-started.html" target="_blank" rel="noopener">快速开始</a></strong></p><p><strong>至于它提供的二进制文件么。。。就看你相不相信它了XD</strong></p><h4 id="配置-3"><a href="#配置-3" class="headerlink" title="配置"></a>配置</h4><p>很抱歉，这么多年过去了（翻修文章的时候还是不会，主要是懒），这种配置文件我还是不会写。。。</p><p><strong>所以我把又我 Windows 下用的 Clash for Windows 的配置文件复制过来了hhhhhh</strong></p><p>动手能力强的你可以结合文档自己 DIY 一下：<a href="https://clash.wiki/configuration/configuration-reference.html" target="_blank" rel="noopener">参考配置</a></p><p>PS: 据我观察大多数 Clash 配置文件中的节点还是用的 Shadowsocks，所以其实可以从 Clash 配置文件中把相关的 Shadowsocks 配置复制出来直接用 Shadowsocks</p><h4 id="GO-GO-GO-3"><a href="#GO-GO-GO-3" class="headerlink" title="GO! GO! GO!"></a>GO! GO! GO!</h4><p>接着看文档吧（确实</p><p>可以考虑以 <code>systemd</code> 服务或者 <code>Docker</code> 的方式运行</p><p>Clash 其实也集成了 HTTP 代理，如果你只是需要用 HTTP/HTTPS 协议科学上网的话，可以直接用环境变量设置系统代理，此处我的 HTTP 代理端口是 7890</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> http_proxy=http://127.0.0.1:7890</span><br><span class="line"><span class="built_in">export</span> https_proxy=http://127.0.0.1:7890</span><br><span class="line"><span class="built_in">export</span> no_proxy=127.0.0.1,localhost</span><br></pre></td></tr></table></figure><p>注意确认一下端口配置是否正确</p><hr><h3 id="Sock5-代理"><a href="#Sock5-代理" class="headerlink" title="Sock5 代理"></a>Sock5 代理</h3><p>有了梯子，还需要本地代理工具去代理你的流量，简单来说就是将你的请求通过本地代理工具发送到本地的科学上网客户端，进而转发到科学上网代理提供商的服务器，最终实现对 GFW 的跨越</p><p>这里使用了 <code>proxychains-ng</code> 进行代理，走的是 Sock5 代理</p><h4 id="安装-4"><a href="#安装-4" class="headerlink" title="安装"></a>安装</h4><p>首先从 GitHub 搞到源码：<a href="https://github.com/rofl0r/proxychains-ng" target="_blank" rel="noopener">这里</a></p><p>然后编译安装（这玩意只能编译安装，还好是 C 语言写的）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">./configure</span><br><span class="line">make -j</span><br><span class="line">sudo make install</span><br></pre></td></tr></table></figure><h4 id="配置-4"><a href="#配置-4" class="headerlink" title="配置"></a>配置</h4><p>新建配置文件夹和配置文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mkdir ~/.proxychains</span><br><span class="line">vi ~/.proxychains/proxychains.conf</span><br></pre></td></tr></table></figure><p>配置如下，记得把最后一行替换成你自己的 Sock5</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">strict_chain</span><br><span class="line">proxy_dns</span><br><span class="line">remote_dns_subnet 224</span><br><span class="line">tcp_read_time_out 15000</span><br><span class="line">tcp_connect_time_out 8000</span><br><span class="line">localnet 127.0.0.0&#x2F;255.0.0.0</span><br><span class="line">quiet_mode</span><br><span class="line"></span><br><span class="line">[ProxyList]</span><br><span class="line">socks5 127.0.0.1 1080</span><br></pre></td></tr></table></figure><h4 id="GO-GO-GO-4"><a href="#GO-GO-GO-4" class="headerlink" title="GO! GO! GO!"></a>GO! GO! GO!</h4><p>用法就很简单了，你可以用 <code>proxychains4</code> 去运行任何你想要的命令和程序，最简单的就是新开一个 <code>bash</code> 然后随便搞</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">proxychains4 bash</span><br></pre></td></tr></table></figure><hr><h3 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h3><p>感谢你看到这里！</p><p>我也不知道当年为啥要复读一遍开头作为文章的总结，于是乎我给原先这段话删了并且提供一个最简单的科学上网方法（大误）：</p><blockquote><p>带上你的电脑和服务器，打车去离你最近的国际机场，买一张机票去一个没有 GFW 的地方网上冲浪（不是）</p></blockquote>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Linux/">Linux</category>
      
      
      <comments>https://ry.huaji.store/2020/08/Linux-magic-network/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>没有桌面环境的 Linux 系统，却需要用浏览器打开网页，这要怎么破？</title>
      <link>https://ry.huaji.store/2020/07/Linux-XServer/</link>
      <guid>https://ry.huaji.store/2020/07/Linux-XServer/</guid>
      <pubDate>Tue, 21 Jul 2020 15:25:45 GMT</pubDate>
      
        
        
      <description>&lt;p&gt;之前有遇到过这种问题，简单来说，平时用的 Linux 都是在服务器上面跑的，所以基本上都是通过 Shell 来进行交互的（至少我都是这么干的），既然是命令行，你想跑带 GUI 的程序肯定是没戏了QAQ&lt;/p&gt;
&lt;p&gt;我之所以会有这个想法，就是用 Linux 服务器的时候有时</description>
        
      
      
      
      <content:encoded><![CDATA[<p>之前有遇到过这种问题，简单来说，平时用的 Linux 都是在服务器上面跑的，所以基本上都是通过 Shell 来进行交互的（至少我都是这么干的），既然是命令行，你想跑带 GUI 的程序肯定是没戏了QAQ</p><p>我之所以会有这个想法，就是用 Linux 服务器的时候有时候需要看一些网页。十分朴素的办法就是用 <code>wget</code> 把网页存下来，然后看网页文件。当然，效果也就那样。</p><p>当然我也有在网络上查过这个问题的解决方法，不过说回来这个问题实在是不好描述。。。一番查找下来，一般就两个办法：</p><p>一个是用 VNC ，用 VNC 的话你的 Linux 就得装个桌面环境，这对于一个服务器来说显然是不太划算的（主要是我服务器带不动） </p><p>一个是用 X Server，不过一堆配置看着还挺复杂的，我也就没啥想法了。。。</p><p><strong>最近用 MobaXterm 的时候，注意到右上角有一个 X server 的图标，就抱着试一试<del>（搞事）</del>的心态给手上的 Ubuntu 装了一个 Firefox ，运行，然后就跑起来了！！</strong></p><p>这事还挺让我惊喜的，没想到这个问题就这么解决了。后来了解了一下，这是 X 协议第 11 个版本，也就是 <strong>X11</strong> 。</p><p>而 X 协议由 X server 和 X client 组成。能实现这个功能主要是靠 <strong>X11-forwarding</strong> 来实现的。</p><p>X11-forwarding 说白了就是用支持 X Server 的 SSH 客户端连接到 Linux ，然后你就可以在 SSH 客户端上操作远程 Linux上个有图形界面的程序啦~~</p><p>如果你用的是 MobaXterm 的话，在登录之后就会显示当前连接是不是支持 X11-forwarding 的。</p><p>对于 Ubuntu 用户来说，一般都是直接配置好的，我用的 <code>Ubuntu 18.04.4 LTS</code> 和 <code>Ubuntu 14.04.1 LTS</code> 都是直接就能用的。</p><p>如果你显示了一把 × ，像这样：</p><p><img src="/images/Linux-XServer/20200630170023.png" alt=""></p><p>比如我的 <code>CentOS 7.6</code> ，说明你还得装点东西：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 xclock</span><br></pre></td></tr></table></figure><p>然后确保你的 <code>/etc/ssh/sshd_config</code> 中的 <code>X11Forwarding</code> 后面是 yes 。不是的话改了之后记得重启一下 sshd 服务。</p><p>重新连接，上面应该就绿了(x)，用时钟测试一下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">xclock</span><br></pre></td></tr></table></figure><p><img src="/images/Linux-XServer/20200630171050.png" alt=""></p><p>最后我要安利一下 MobaXterm ，不仅支持 X11-forwarding，有一说一，确实好用，<a href="https://mobaxterm.mobatek.net/" target="_blank" rel="noopener">官网</a>的 Home Edition 基本能满足一切日常连接的需求，还有 Portable 版本可选，唯一的缺点就是下载速度太慢，得用一些魔法才行。</p><p><del>PS：我之所以会一直用这个软件，是因为里面自带的游戏实在是太香了hhh</del></p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Linux/">Linux</category>
      
      
      <comments>https://ry.huaji.store/2020/07/Linux-XServer/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Java EE 04：一个基于 Springboot + Vue.js + Mybatis + MySQL + RestfulAPI + Docker 的简单作业管理系统</title>
      <link>https://ry.huaji.store/2020/06/JavaEE-04/</link>
      <guid>https://ry.huaji.store/2020/06/JavaEE-04/</guid>
      <pubDate>Thu, 18 Jun 2020 14:25:21 GMT</pubDate>
      
      <description>本文将介绍一个基于 Springboot + Vue.js + Mybatis + MySQL + RestfulAPI + Docker 的简单作业管理系统</description>
      
      
      
      <content:encoded><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>本文将介绍一个基于 Springboot + Vue.js + Mybatis + MySQL + RestfulAPI + Docker 的简单作业管理系统。</p><p>Git 仓库地址：<a href="https://github.com/dongshunyao/HomeworkManagementFinal" target="_blank" rel="noopener">HomeworkManagementFinal</a></p><p>开源许可证采用 <code>Apache-2.0</code></p><p>这个系统在之前的作业管理系统 <a href="https://github.com/dongshunyao/HomeworkManagement" target="_blank" rel="noopener">HomeworkManagement</a> 的基础上<strong>完全重构</strong>，并添加了<strong>新的功能与科技</strong>。</p><hr><h3 id="快速上手"><a href="#快速上手" class="headerlink" title="快速上手"></a>快速上手</h3><h4 id="使用-docker-快速部署"><a href="#使用-docker-快速部署" class="headerlink" title="使用 docker 快速部署"></a>使用 docker 快速部署</h4><p>如果你已经正确安装 docker，可以通过下列命令快速部署：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker pull registry.cn-beijing.aliyuncs.com/springwinter/17301122-homeworkmanagement:1.0</span><br><span class="line">docker run -dit --name=<span class="built_in">test</span> -p 8081:8081 registry.cn-beijing.aliyuncs.com/springwinter/17301122-homeworkmanagement:1.0</span><br></pre></td></tr></table></figure><p>项目启动后访问 <a href="http://localhost:8081/" target="_blank" rel="noopener">http://localhost:8081/</a> 即可。</p><h4 id="自行编译和构建"><a href="#自行编译和构建" class="headerlink" title="自行编译和构建"></a>自行编译和构建</h4><p>如果选择自行编译和构建，请使用 <code>git clone</code> 并使用 <code>Maven</code> 进行构建，或者使用提供的 <code>Jar</code>包。</p><p>前端请使用 <code>npm</code> 构建，构建结束后将输出放置在 <code>/src/main/resources/static</code> 目录下。</p><p>数据库部分使用 <code>hwm.sql</code>  进行导入，并在 <code>/src/main/resources/application.yml</code> 处修改相关配置。</p><hr><h3 id="系统与架构"><a href="#系统与架构" class="headerlink" title="系统与架构"></a>系统与架构</h3><h4 id="前端"><a href="#前端" class="headerlink" title="前端"></a>前端</h4><p>前端代码位于 <code>client</code> 目录。</p><p>前端使用 <code>Vue.js</code> 进行编写，使用 <code>POST</code> 方法与后端 <code>RestfulAPI</code>进行交互。</p><p>部分组件使用了 <code>element</code>组件库，提高开发效率。</p><p>构建部分请参考对应目录下的 <code>README.md</code>。</p><h4 id="数据库"><a href="#数据库" class="headerlink" title="数据库"></a>数据库</h4><p>数据库部分使用了 <code>MySQL</code> 数据库，数据库转储文件请见 <code>hwm.sql</code>。</p><p>数据库一共包含了四张表格：</p><p><img src="/images/JavaEE-04/20200620001952.png" alt=""></p><h4 id="后端"><a href="#后端" class="headerlink" title="后端"></a>后端</h4><p>后端使用 <code>Springboot</code>进行开发，使用 <code>Maven</code>管理依赖和进行构建。</p><p>数据库连接部分使用了 <code>Mybatis</code> 进行连接，使用注解编写 <code>SQL</code> 语句。</p><p><code>Controller</code>部分遵循 <code>RestfulAPI</code>风格，所有接口均使用 <code>Json</code>进行数据交互。</p><p><strong>由于这里系统包含了登录功能，这里使用 <code>token</code>进行实现。</strong>进行登录后，前端会将后端返回的 <code>token</code> 记录在 <code>cookie</code> 中，在之后的任何对后端的接口的访问都会需要前端提供 <code>token</code>进行身份验证，验证失败则请求无效。进行登出的时候会清除 <code>token</code>，每一次登录请求都会重新生成 <code>token</code>。</p><p>接口文档如下：</p><blockquote><p><strong>/user 用户控制器</strong></p></blockquote><p><strong>/login 登录</strong></p><p>请求：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>id</td><td>Int</td><td>学号或者工号</td></tr><tr><td>password</td><td>String</td><td>密码</td></tr><tr><td>teacher</td><td>Boolean</td><td>是否是老师</td></tr></tbody></table><p>返回：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>state</td><td>Int</td><td>状态码</td></tr><tr><td>id</td><td>String</td><td>学号或者工号</td></tr><tr><td>teacher</td><td>Boolean</td><td>是否是老师</td></tr><tr><td>message</td><td>String</td><td>返回消息</td></tr><tr><td>token</td><td>String</td><td>登录状态Token</td></tr></tbody></table><hr><p><strong>/logout 登出</strong></p><p>请求：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>id</td><td>Int</td><td>学号或者工号</td></tr><tr><td>password</td><td>String</td><td>密码</td></tr><tr><td>teacher</td><td>Boolean</td><td>是否是老师</td></tr></tbody></table><p>返回：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>state</td><td>Int</td><td>状态码</td></tr><tr><td>id</td><td>String</td><td>学号或者工号</td></tr><tr><td>teacher</td><td>Boolean</td><td>是否是老师</td></tr><tr><td>message</td><td>String</td><td>返回消息</td></tr><tr><td>token</td><td>String</td><td>登录状态Token</td></tr></tbody></table><hr><p><strong>/register 注册</strong></p><p>请求：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>id</td><td>Int</td><td>学号或者工号</td></tr><tr><td>name</td><td>String</td><td>姓名</td></tr><tr><td>password</td><td>String</td><td>密码</td></tr><tr><td>teacher</td><td>Boolean</td><td>是否是老师</td></tr></tbody></table><p>返回：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>state</td><td>Int</td><td>状态码</td></tr><tr><td>message</td><td>String</td><td>返回消息</td></tr></tbody></table><hr><blockquote><p><strong>/student 学生控制器</strong></p></blockquote><p><strong>/homework_list 获取作业列表</strong></p><p>请求：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>id</td><td>Int</td><td>学号</td></tr><tr><td>token</td><td>String</td><td>登录状态Token</td></tr></tbody></table><p>返回：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>state</td><td>Int</td><td>状态码</td></tr><tr><td>message</td><td>String</td><td>返回消息</td></tr><tr><td>list</td><td>String</td><td>作业列表</td></tr></tbody></table><p><code>list</code> 中元素格式如下：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>homeworkId</td><td>Int</td><td>作业ID</td></tr><tr><td>teacherName</td><td>String</td><td>发布老师的名字</td></tr><tr><td>title</td><td>String</td><td>作业标题</td></tr><tr><td>type</td><td>Int</td><td>作业类型：1为未提交，2为未批阅，3为已批阅</td></tr></tbody></table><hr><p><strong>/homework_info 获取作业详情</strong></p><p>请求：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>id</td><td>Int</td><td>学号</td></tr><tr><td>homeworkId</td><td>String</td><td>作业ID</td></tr><tr><td>token</td><td>String</td><td>登录状态Token</td></tr></tbody></table><p>返回：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>state</td><td>Int</td><td>状态码</td></tr><tr><td>message</td><td>String</td><td>返回消息</td></tr><tr><td>homeworkId</td><td>Int</td><td>作业ID</td></tr><tr><td>homeworkTitle</td><td>String</td><td>作业标题</td></tr><tr><td>homeworkContent</td><td>String</td><td>作业内容</td></tr><tr><td>type</td><td>Int</td><td>作业类型：1为未提交，2为未批阅，3为已批阅</td></tr><tr><td>submitTitle</td><td>String</td><td>提交的作业的标题</td></tr><tr><td>submitContent</td><td>String</td><td>提交的作业的内容</td></tr><tr><td>score</td><td>Int</td><td>批阅分数</td></tr><tr><td>comment</td><td>String</td><td>批阅评语</td></tr></tbody></table><hr><p><strong>/submit 提交作业</strong></p><p>请求：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>id</td><td>Int</td><td>学号</td></tr><tr><td>homeworkId</td><td>String</td><td>作业ID</td></tr><tr><td>title</td><td>String</td><td>作业标题</td></tr><tr><td>content</td><td>String</td><td>作业内容</td></tr><tr><td>token</td><td>String</td><td>登录状态Token</td></tr></tbody></table><p>返回：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>state</td><td>Int</td><td>状态码</td></tr><tr><td>message</td><td>String</td><td>返回消息</td></tr></tbody></table><hr><blockquote><p><strong>/teacher 老师控制器</strong></p></blockquote><p><strong>/homework_list 获取作业列表</strong></p><p>请求：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>id</td><td>Int</td><td>工号</td></tr><tr><td>token</td><td>String</td><td>登录状态Token</td></tr></tbody></table><p>返回：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>state</td><td>Int</td><td>状态码</td></tr><tr><td>message</td><td>String</td><td>返回消息</td></tr><tr><td>list</td><td>String</td><td>作业列表</td></tr></tbody></table><p><code>list</code> 中元素格式如下：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>homeworkId</td><td>Int</td><td>作业ID</td></tr><tr><td>title</td><td>String</td><td>作业标题</td></tr><tr><td>submitCount</td><td>Int</td><td>已经提交的个数</td></tr></tbody></table><hr><p><strong>/submit_list 获取指定作业的已提交列表</strong></p><p>请求：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>id</td><td>Int</td><td>工号</td></tr><tr><td>homeworkId</td><td>String</td><td>作业ID</td></tr><tr><td>token</td><td>String</td><td>登录状态Token</td></tr></tbody></table><p>返回：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>state</td><td>Int</td><td>状态码</td></tr><tr><td>message</td><td>String</td><td>返回消息</td></tr><tr><td>list</td><td>String</td><td>提交列表</td></tr></tbody></table><p><code>list</code> 中元素格式如下：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>submitId</td><td>Int</td><td>提交ID</td></tr><tr><td>studentId</td><td>Int</td><td>学号</td></tr><tr><td>studentName</td><td>String</td><td>学生姓名</td></tr><tr><td>type</td><td>Int</td><td>作业类型：2为未批阅，3为已批阅</td></tr></tbody></table><hr><p><strong>/submit_info 获取提交详情</strong></p><p>请求：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>id</td><td>Int</td><td>工号</td></tr><tr><td>submitId</td><td>String</td><td>提交ID</td></tr><tr><td>token</td><td>String</td><td>登录状态Token</td></tr></tbody></table><p>返回：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>state</td><td>Int</td><td>状态码</td></tr><tr><td>message</td><td>String</td><td>返回消息</td></tr><tr><td>submitId</td><td>Int</td><td>提交ID</td></tr><tr><td>studentId</td><td>Int</td><td>学号</td></tr><tr><td>type</td><td>Int</td><td>作业类型：2为未批阅，3为已批阅</td></tr><tr><td>submitTitle</td><td>String</td><td>提交的作业的标题</td></tr><tr><td>submitContent</td><td>String</td><td>提交的作业的内容</td></tr><tr><td>score</td><td>Int</td><td>批阅分数</td></tr><tr><td>comment</td><td>String</td><td>批阅评语</td></tr></tbody></table><hr><p><strong>/review 批阅作业</strong></p><p>请求：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>id</td><td>Int</td><td>工号</td></tr><tr><td>submitId</td><td>String</td><td>提交ID</td></tr><tr><td>score</td><td>Int</td><td>批阅分数</td></tr><tr><td>comment</td><td>String</td><td>批阅评语</td></tr><tr><td>token</td><td>String</td><td>登录状态Token</td></tr></tbody></table><p>返回：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>state</td><td>Int</td><td>状态码</td></tr><tr><td>message</td><td>String</td><td>返回消息</td></tr></tbody></table><hr><p><strong>/add_homework 发布作业</strong></p><p>请求：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>id</td><td>Int</td><td>工号</td></tr><tr><td>title</td><td>String</td><td>作业标题</td></tr><tr><td>content</td><td>String</td><td>作业内容</td></tr><tr><td>token</td><td>String</td><td>登录状态Token</td></tr></tbody></table><p>返回：</p><table><thead><tr><th>param</th><th>value</th><th>备注</th></tr></thead><tbody><tr><td>state</td><td>Int</td><td>状态码</td></tr><tr><td>message</td><td>String</td><td>返回消息</td></tr></tbody></table><hr><h3 id="功能特点"><a href="#功能特点" class="headerlink" title="功能特点"></a>功能特点</h3><p>这个项目是为学生和教师设计的简易的作业的提交和管理平台。</p><p>对于教师，有以下功能：</p><ul><li>注册账户</li><li>登录账户</li><li>登出账户</li><li>发布作业</li><li>查看已发布的作业列表和详情</li><li>查看提交的作业内容列表和详情</li><li>对提交的作业进行批阅，包括评分和评语</li></ul><p>对于学生，有以下功能：</p><ul><li>注册账户</li><li>登录账户</li><li>登出账户</li><li>查看已发布的作业列表和详情</li><li>提交作业，对已经提交但未批阅的作业可以进行修改</li><li>查看作业的状态</li><li>查看作业的评分和评语</li></ul><hr><h3 id="系统演示"><a href="#系统演示" class="headerlink" title="系统演示"></a>系统演示</h3><h4 id="登录与注册"><a href="#登录与注册" class="headerlink" title="登录与注册"></a>登录与注册</h4><p>启动后首先进入首页，你可以进行输入信息并选择角色进行登录。</p><p><img src="/images/JavaEE-04/20200620005736.png" alt=""></p><p>点击注册按钮可以跳转到注册页面。</p><p><img src="/images/JavaEE-04/20200620005834.png" alt=""></p><h4 id="老师相关"><a href="#老师相关" class="headerlink" title="老师相关"></a>老师相关</h4><p>老师登录后将进入老师的主页。</p><p><img src="/images/JavaEE-04/20200620010218.png" alt=""></p><p>这里会显示此老师所有发布的作业和提交的数量。点击相应的按钮即可查看提交详情并进行批阅。</p><p><img src="/images/JavaEE-04/20200620010801.png" alt=""></p><p>进入后将展示这个作业的所有提交，并显示当前状态，点击批阅按钮即可进行批阅。</p><p><img src="/images/JavaEE-04/20200620010909.png" alt=""></p><p>已经批阅的作业将显示批阅结构，也可以进行多次批阅。</p><p><img src="/images/JavaEE-04/20200620011038.png" alt=""></p><p>顶部导航栏可以进行发布作业和登出，右边显示当前老师的工号。</p><p>点击发布作业将会跳转到作业发布页面，在这里输入作业标题和内容即可发布作业，发布后将跳转到主页。</p><p><img src="/images/JavaEE-04/20200620010154.png" alt=""></p><p>点击登出按钮将进行询问，询问是否登出，确认后登出，并跳转到登录页面。</p><p><img src="/images/JavaEE-04/20200620010433.png" alt=""></p><h4 id="学生相关"><a href="#学生相关" class="headerlink" title="学生相关"></a>学生相关</h4><p>使用学生帐号进行登录后将跳转到学生主页。</p><p>这里展示了所有老师发布的作业和状态。</p><p><img src="/images/JavaEE-04/20200620011404.png" alt=""></p><p>对于未提交的作业，可以点击相应按钮查看详情并进行提交。</p><p><img src="/images/JavaEE-04/20200620011525.png" alt=""></p><p>对于已经提交的作业，如果老师还没有进行批阅，可以对提交的作业进行更新。</p><p><img src="/images/JavaEE-04/20200620011630.png" alt=""></p><p>对于已经批阅的作业，无法进行修改，但是可以查看老师的评分和评语。</p><p><img src="/images/JavaEE-04/20200620011719.png" alt=""></p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Java-EE/">Java EE</category>
      
      
      <comments>https://ry.huaji.store/2020/06/JavaEE-04/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>快速幂</title>
      <link>https://ry.huaji.store/2020/05/Leetcode-50/</link>
      <guid>https://ry.huaji.store/2020/05/Leetcode-50/</guid>
      <pubDate>Mon, 11 May 2020 16:53:08 GMT</pubDate>
      
        
        
      <description>&lt;blockquote&gt;
&lt;p&gt;上一次手写快速幂还是大一时候的事情了，这次遇到了就顺便复习一下~&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;快速幂，顾名思义就是快速算幂。&lt;/p&gt;
&lt;p&gt;正常计算 x 的 n 次方，办法就是乘 n 次 x 就行，时间复杂度 O(n) 。当然，这个办</description>
        
      
      
      
      <content:encoded><![CDATA[<blockquote><p>上一次手写快速幂还是大一时候的事情了，这次遇到了就顺便复习一下~</p></blockquote><p>快速幂，顾名思义就是快速算幂。</p><p>正常计算 x 的 n 次方，办法就是乘 n 次 x 就行，时间复杂度 O(n) 。当然，这个办法慢了。</p><p>要快的的话，就把 n 拆成二进制。对与二进制中的第 <code>i</code> 位，如果这一位为 1 ，则代表最后的答案中包含 x 的 2 的 <code>i - 1</code> 次方，也就是说从低位到高位的 1 分别对应了 x, x^2, x^4, x^8, …</p><p>这样一来，只需要按位进行累乘，同时这一位需要的乘数可以由上一位转移而来，也就是 <code>x *= x</code> 。时间复杂度 O(logn) 。</p><hr><h3 id="Pow-x-n"><a href="#Pow-x-n" class="headerlink" title="Pow(x, n)"></a>Pow(x, n)</h3><p><a href="https://leetcode-cn.com/problems/powx-n/" target="_blank" rel="noopener">Leetcode 50 Pow(x, n)</a></p><p>这题就是快速幂了，不过有几个点需要注意一下：</p><ul><li><p>n 为负数的时候需要判断，结果用 1 除以一下答案就行。</p></li><li><p>传进来的 n 是一个 32 位整数，范围 [−2^31, 2^31 − 1] ，所以直接取绝对值是不行的，需要转换为 64 位整数或者无符号整数。</p></li><li><p>n 为 0 的问题，下面这个写法解决了这个。</p></li></ul><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">myPow</span><span class="params">(<span class="keyword">double</span> x, <span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> flag = n &gt;= <span class="number">0</span>;</span><br><span class="line"><span class="keyword">auto</span> <span class="built_in">pow</span> = <span class="built_in">abs</span>(<span class="keyword">static_cast</span>&lt;<span class="keyword">long</span> <span class="keyword">long</span>&gt;(n));</span><br><span class="line"><span class="keyword">double</span> ans = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (<span class="built_in">pow</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">pow</span> &amp; <span class="number">1</span>) ans *= x;</span><br><span class="line">x *= x;</span><br><span class="line"><span class="built_in">pow</span> &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> flag ? ans : <span class="number">1</span> / ans;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><hr><h3 id="模意义下的快速幂"><a href="#模意义下的快速幂" class="headerlink" title="模意义下的快速幂"></a>模意义下的快速幂</h3><p>反正幂的时候取模就好了hhh</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">qkpow</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x, <span class="keyword">long</span> <span class="keyword">long</span> n, <span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> mod)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">1</span>;</span><br><span class="line">x %= mod;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (n)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (n &amp; <span class="number">1</span>) ans = (ans * x) % mod;</span><br><span class="line">x = (x * x) % mod;</span><br><span class="line">n &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> ans % mod;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Leetcode/">Leetcode</category>
      
      
      <comments>https://ry.huaji.store/2020/05/Leetcode-50/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>LRU 与 LFU 缓存算法</title>
      <link>https://ry.huaji.store/2020/04/Leetcode-LRU-LFU/</link>
      <guid>https://ry.huaji.store/2020/04/Leetcode-LRU-LFU/</guid>
      <pubDate>Sat, 18 Apr 2020 17:54:30 GMT</pubDate>
      
        
        
      <description>&lt;h3 id=&quot;LRU&quot;&gt;&lt;a href=&quot;#LRU&quot; class=&quot;headerlink&quot; title=&quot;LRU&quot;&gt;&lt;/a&gt;LRU&lt;/h3&gt;&lt;h4 id=&quot;概念&quot;&gt;&lt;a href=&quot;#概念&quot; class=&quot;headerlink&quot; title=&quot;概念&quot;&gt;&lt;/a&gt;概念&lt;/h4&gt;&lt;p</description>
        
      
      
      
      <content:encoded><![CDATA[<h3 id="LRU"><a href="#LRU" class="headerlink" title="LRU"></a>LRU</h3><h4 id="概念"><a href="#概念" class="headerlink" title="概念"></a>概念</h4><p>LRU 是最近最少使用 Least Recently Used 的缩写。一种常用的页面置换算法，常用来设计缓存。</p><p>每次缓存空间不足时，选择缓存中最久没有使用的缓存进行删除，然后写入新的缓存。</p><p>获取数据 get(key) 方法：如果密钥 key 存在于缓存中，则获取对应的 value 并将这个缓存标记为访问，否则返回 -1。</p><p>写入数据 put(key, value) 方法：如果密钥 key 不存在，则写入其 value。当缓存容量达到上限时，它应该在写入新数据之前删除最久未使用的缓存，然后进行写入。</p><h4 id="设计"><a href="#设计" class="headerlink" title="设计"></a>设计</h4><p>为了保证 get 和 put 都是 O(1) 的，这里用双向链表+哈希表进行构建。双向链表修改时 O(1) ，使用单链表的话修改是 O(n) 的。</p><p>哈希表用于 O(1) 的进行 get 操作，双向链表用于维护时间的访问顺序，一旦访问了就将这个节点移动到链表头。</p><p>get 操作时，找到了就将节点移动到链表头并返回 value 值，否则返回 -1。</p><p>put 操作时，如果此时缓存已经满了，就先移除最久没有使用的缓存，也就是链表的尾节点，并删除哈希表的对应位置。然后进行插入，新节点被放置在链表头部。</p><h4 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h4><p><a href="https://leetcode-cn.com/problems/lru-cache/" target="_blank" rel="noopener">Leetcode 146 LRU缓存机制</a></p><p>这里是双向链表是手写的，所以需要一个头结点和尾节点。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">LRUCache</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> val;</span><br><span class="line"><span class="keyword">int</span> key;</span><br><span class="line">node* pre;</span><br><span class="line">node* next;</span><br><span class="line"></span><br><span class="line">node(): val(<span class="number">0</span>), key(<span class="number">0</span>), pre(<span class="literal">nullptr</span>), next(<span class="literal">nullptr</span>)</span><br><span class="line">&#123;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">node* head;</span><br><span class="line">node* tail;</span><br><span class="line"><span class="built_in">unordered_map</span>&lt;<span class="keyword">int</span>, node*&gt; <span class="built_in">map</span>;</span><br><span class="line"><span class="keyword">int</span> capacity;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">addNode</span><span class="params">(node* node)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">node-&gt;next = head-&gt;next;</span><br><span class="line">node-&gt;pre = head;</span><br><span class="line">head-&gt;next-&gt;pre = node;</span><br><span class="line">head-&gt;next = node;</span><br><span class="line"><span class="built_in">map</span>[node-&gt;key] = node;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">deleteNode</span><span class="params">(node* node, <span class="keyword">bool</span> del)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">node-&gt;pre-&gt;next = node-&gt;next;</span><br><span class="line">node-&gt;next-&gt;pre = node-&gt;pre;</span><br><span class="line"><span class="keyword">if</span> (del)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">map</span>.erase(node-&gt;key);</span><br><span class="line"><span class="keyword">delete</span> node;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">moveToHead</span><span class="params">(node* node)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">deleteNode(node, <span class="literal">false</span>);</span><br><span class="line">addNode(node);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">LRUCache(<span class="keyword">int</span> capacity)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">this</span>-&gt;capacity = capacity;</span><br><span class="line">head = <span class="keyword">new</span> node();</span><br><span class="line">tail = <span class="keyword">new</span> node();</span><br><span class="line">head-&gt;next = tail;</span><br><span class="line">tail-&gt;pre = head;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">~LRUCache()</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">while</span> (head != <span class="literal">nullptr</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> temp = head;</span><br><span class="line">head = head-&gt;next;</span><br><span class="line"><span class="keyword">delete</span> temp;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">get</span><span class="params">(<span class="keyword">int</span> key)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">map</span>.count(key) == <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> node = <span class="built_in">map</span>[key];</span><br><span class="line">moveToHead(node);</span><br><span class="line"><span class="keyword">return</span> node-&gt;val;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">put</span><span class="params">(<span class="keyword">int</span> key, <span class="keyword">int</span> value)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">map</span>.count(key) == <span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> temp = <span class="keyword">new</span> node();</span><br><span class="line">temp-&gt;key = key;</span><br><span class="line">temp-&gt;val = value;</span><br><span class="line">addNode(temp);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> temp = <span class="built_in">map</span>[key];</span><br><span class="line">temp-&gt;val = value;</span><br><span class="line">moveToHead(temp);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">map</span>.size() &gt; capacity) deleteNode(tail-&gt;pre, <span class="literal">true</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Your LRUCache object will be instantiated and called as such:</span></span><br><span class="line"><span class="comment"> * LRUCache* obj = new LRUCache(capacity);</span></span><br><span class="line"><span class="comment"> * int param_1 = obj-&gt;get(key);</span></span><br><span class="line"><span class="comment"> * obj-&gt;put(key,value);</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure><hr><h3 id="LFU"><a href="#LFU" class="headerlink" title="LFU"></a>LFU</h3><h4 id="概念-1"><a href="#概念-1" class="headerlink" title="概念"></a>概念</h4><p>最不经常使用算法。这个缓存算法使用一个计数器来记录每个缓存的使用次数，缓存满时选择使用次数最低的且是最久没有使用的缓存进行删除。</p><p>这个方法并不经常使用，因为它无法对一个拥有最初高访问率之后长时间没有被访问的缓存负责。</p><p>获取数据 get(key) 方法：如果密钥 key 存在于缓存中，则获取对应的 value 并将这个缓存的使用次数 +1，否则返回 -1。</p><p>写入数据 put(key, value) 方法：如果密钥 key 存在，则修改对应的 value 值，并把使用次数 +1。如果密钥 key 不存在，先判断缓存是否已经满了，如果满了，则删除最小使用次数中最久没有访问的缓存，然后再写入这个 key 对应 value ，并设置访问次数为 1 。</p><h4 id="设计-1"><a href="#设计-1" class="headerlink" title="设计"></a>设计</h4><p>这里使用的了两个哈希表，保证 get 和 put 都是 O(1) 的。</p><p>一个哈希表用于存放 key 和节点的对应关系，用于 O(1) 的进行 get 操作。</p><p>一个哈希表以使用次数为 key ，以一个双向链表为 value 。每一个双向链表类似于 LRU ，按时间顺序存放这个使用次数下的节点，最新的在链表头，最久没有访问的在链表尾。</p><p>然后还需要一个变量记录当前最小的使用次数。</p><p>第二个哈希表可以用一个双向链表替代，效果不变。</p><p>get 操作时，找到了就将节点从当前的链表移除，并将使用次数 +1 ，然后放置在此时对应的使用次数的链表头部（这个时候如果旧的链表已经空了，需要删除空链表，同时判断最小使用次数是否需要更新）并返回 value 值，否则返回 -1。</p><p>put 操作时，<strong>先看能不能找到这个 key</strong> ：</p><ul><li><p>能找到：<strong>修改对应的 value ，然后将节点从当前的链表移除，并将使用次数 +1 ，然后放置在此时对应的使用次数的链表头部</strong>（这个时候如果旧的链表已经空了，需要删除空链表，同时判断最小使用次数是否需要更新）并更新哈希表，这个操作类似与 get 。（这里不能删掉现有的然后插入一个使用次数为 1 的节点）</p></li><li><p>找不到：先看缓存是否已经满了，满了则删除最小使用次数对应的链表的尾部节点。然后进行插入，设置使用次数为 1 ，并更新最小使用次数和哈希表。</p></li></ul><h4 id="实现-1"><a href="#实现-1" class="headerlink" title="实现"></a>实现</h4><p><a href="https://leetcode-cn.com/problems/lfu-cache/" target="_blank" rel="noopener">Leetcode 460 LFU缓存</a></p><p>这里使用的是双哈希表，使用了 list 作为双向链表。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">LFUCache</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> key;</span><br><span class="line"><span class="keyword">int</span> value;</span><br><span class="line"><span class="keyword">int</span> freq;</span><br><span class="line"></span><br><span class="line">Node(<span class="keyword">int</span> key, <span class="keyword">int</span> value, <span class="keyword">int</span> freq)</span><br><span class="line">: key(key), value(value), freq(freq)</span><br><span class="line">&#123;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> capacity;</span><br><span class="line"><span class="keyword">int</span> minFreq;</span><br><span class="line"><span class="built_in">unordered_map</span>&lt;<span class="keyword">int</span>, <span class="built_in">list</span>&lt;Node&gt;::iterator&gt; hash;</span><br><span class="line"><span class="built_in">unordered_map</span>&lt;<span class="keyword">int</span>, <span class="built_in">list</span>&lt;Node&gt;&gt; freqMap;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">addFreq</span><span class="params">(<span class="keyword">const</span> <span class="built_in">list</span>&lt;Node&gt;::iterator&amp; now)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> key = now-&gt;key, value = now-&gt;value, freq = now-&gt;freq;</span><br><span class="line">eraseNode(now);</span><br><span class="line"></span><br><span class="line">freqMap[freq + <span class="number">1</span>].emplace_front(key, value, freq + <span class="number">1</span>);</span><br><span class="line">hash[key] = freqMap[freq + <span class="number">1</span>].begin();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">eraseNode</span><span class="params">(<span class="built_in">list</span>&lt;Node&gt;::iterator now)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> key = now-&gt;key, freq = now-&gt;freq;</span><br><span class="line">hash.erase(key);</span><br><span class="line">freqMap[freq].erase(now);</span><br><span class="line"><span class="keyword">if</span> (freqMap[freq].empty())</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (freq == minFreq) minFreq++;</span><br><span class="line">freqMap.erase(freq);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">LFUCache(<span class="keyword">int</span> capacity)</span><br><span class="line">: capacity(capacity), minFreq(<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">get</span><span class="params">(<span class="keyword">int</span> key)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (capacity == <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">if</span> (hash.count(key) == <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> value = hash[key]-&gt;value;</span><br><span class="line">addFreq(hash[key]);</span><br><span class="line"><span class="keyword">return</span> value;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">put</span><span class="params">(<span class="keyword">int</span> key, <span class="keyword">int</span> value)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (capacity == <span class="number">0</span>) <span class="keyword">return</span>;</span><br><span class="line"><span class="keyword">if</span> (hash.count(key) == <span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (hash.size() == capacity) eraseNode(--freqMap[minFreq].end());</span><br><span class="line"></span><br><span class="line">freqMap[<span class="number">1</span>].emplace_front(key, value, <span class="number">1</span>);</span><br><span class="line">hash[key] = freqMap[<span class="number">1</span>].begin();</span><br><span class="line">minFreq = <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">hash[key]-&gt;value = value;</span><br><span class="line">addFreq(hash[key]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Your LFUCache object will be instantiated and called as such:</span></span><br><span class="line"><span class="comment"> * LFUCache* obj = new LFUCache(capacity);</span></span><br><span class="line"><span class="comment"> * int param_1 = obj-&gt;get(key);</span></span><br><span class="line"><span class="comment"> * obj-&gt;put(key,value);</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Leetcode/">Leetcode</category>
      
      
      <comments>https://ry.huaji.store/2020/04/Leetcode-LRU-LFU/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Java EE 03：Spring Web MVC 分析与流程</title>
      <link>https://ry.huaji.store/2020/04/JavaEE-03/</link>
      <guid>https://ry.huaji.store/2020/04/JavaEE-03/</guid>
      <pubDate>Tue, 14 Apr 2020 02:51:44 GMT</pubDate>
      
        
        
      <description>&lt;h3 id=&quot;什么是-Spring-Web-MVC&quot;&gt;&lt;a href=&quot;#什么是-Spring-Web-MVC&quot; class=&quot;headerlink&quot; title=&quot;什么是 Spring Web MVC&quot;&gt;&lt;/a&gt;什么是 Spring Web MVC&lt;/h3&gt;&lt;p&gt;Spring</description>
        
      
      
      
      <content:encoded><![CDATA[<h3 id="什么是-Spring-Web-MVC"><a href="#什么是-Spring-Web-MVC" class="headerlink" title="什么是 Spring Web MVC"></a>什么是 Spring Web MVC</h3><p>Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架。Spring Web MVC 从最初就已经包含在 Spring 框架中。正式名称 <strong>Spring Web MVC</strong> 来自其源模块 (<strong>spring-webmvc</strong>) 的名称，但现在通常被称为 <strong>Spring MVC</strong>，下文也采用这个简写。</p><p>和许多的 Web 框架一样，Spring MVC 是围绕着一个前端控制器模式进行设计的。这里围绕着一个 <code>Servlet</code>，它被称为 <code>DispatcherServlet</code>。这里提供了用于处理请求的的共享算法，而实际的工作是由配置的委托组件去执行的。这种模型非常灵活，并支持多种工作流程。</p><p>下面将从 Serlvet 注册、IoC 容器创建、Bean 初始化、MVC 的流程这几个方面进行阐述。</p><hr><h3 id="Serlvet-注册"><a href="#Serlvet-注册" class="headerlink" title="Serlvet 注册"></a>Serlvet 注册</h3><p>Spring MVC 所依赖的 <code>DispatcherServlet</code> 和普通的 Servlet 一样，需要我们通过 Java 代码或者 <code>web.xml</code>文件进行配置。同时 <code>DispatcherServlet</code> 使用 Spring 的配置文件来发现它所需要进行处理程序映射、视图解析、异常处理等工作的委托组件。</p><p><img src="/images/JavaEE-03/20200415130926.png" alt=""></p><p>官方为我们展示了两种注册 <code>DispatcherServlet</code> 的方式：</p><blockquote><p>Java 代码（当然你也可以使用 Kotlin，这里就不赘述了）</p></blockquote><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyWebApplicationInitializer</span> <span class="keyword">implements</span> <span class="title">WebApplicationInitializer</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onStartup</span><span class="params">(ServletContext servletCxt)</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Load Spring web application configuration</span></span><br><span class="line">        AnnotationConfigWebApplicationContext ac = <span class="keyword">new</span> AnnotationConfigWebApplicationContext();</span><br><span class="line">        ac.register(AppConfig<span class="class">.<span class="keyword">class</span>)</span>;</span><br><span class="line">        ac.refresh();</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Create and register the DispatcherServlet</span></span><br><span class="line">        DispatcherServlet servlet = <span class="keyword">new</span> DispatcherServlet(ac);</span><br><span class="line">        ServletRegistration.Dynamic registration = servletCxt.addServlet(<span class="string">"app"</span>, servlet);</span><br><span class="line">        registration.setLoadOnStartup(<span class="number">1</span>);</span><br><span class="line">        registration.addMapping(<span class="string">"/app/*"</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><p>web.xml 文件</p></blockquote><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">web-app</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">listener</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">listener-class</span>&gt;</span>org.springframework.web.context.ContextLoaderListener<span class="tag">&lt;/<span class="name">listener-class</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">listener</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">context-param</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">param-name</span>&gt;</span>contextConfigLocation<span class="tag">&lt;/<span class="name">param-name</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">param-value</span>&gt;</span>/WEB-INF/app-context.xml<span class="tag">&lt;/<span class="name">param-value</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">context-param</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">servlet</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">servlet-name</span>&gt;</span>app<span class="tag">&lt;/<span class="name">servlet-name</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">servlet-class</span>&gt;</span>org.springframework.web.servlet.DispatcherServlet<span class="tag">&lt;/<span class="name">servlet-class</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">init-param</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">param-name</span>&gt;</span>contextConfigLocation<span class="tag">&lt;/<span class="name">param-name</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">param-value</span>&gt;</span><span class="tag">&lt;/<span class="name">param-value</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">init-param</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">load-on-startup</span>&gt;</span>1<span class="tag">&lt;/<span class="name">load-on-startup</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">servlet</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">servlet-mapping</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">servlet-name</span>&gt;</span>app<span class="tag">&lt;/<span class="name">servlet-name</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">url-pattern</span>&gt;</span>/app/*<span class="tag">&lt;/<span class="name">url-pattern</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">servlet-mapping</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">web-app</span>&gt;</span></span><br></pre></td></tr></table></figure><p>有一个这里的小细节，上面的 XML 文件中出现了两个文件路径。</p><p>这里的 <code>&lt;context-param&gt;</code> 中的 <code>&lt;param-value&gt;</code> 是对整个 application 的上下文参数。这个是配置在 Web 下面的，Spring 框架在加载配置文件的时候，加载的是 <code>&lt;context-param&gt;</code> 配置文件的内容。</p><p>而 <code>&lt;init-param&gt;</code> 中的 <code>&lt;param-value&gt;</code> 是对 <code>DispatcherServlet</code> 的上下文参数，只有初始化了这个 Servlet，才会加载 <code>&lt;init-param&gt;</code> 中的配置文件。</p><hr><h3 id="IoC-容器创建"><a href="#IoC-容器创建" class="headerlink" title="IoC 容器创建"></a>IoC 容器创建</h3><h4 id="什么是-IoC"><a href="#什么是-IoC" class="headerlink" title="什么是 IoC"></a>什么是 IoC</h4><p>IoC 是 Inversion of Control 的缩写，现在通常被翻译为<strong>控制反转</strong>。</p><p>Ioc 是面向对象编程中的一个重要的设计思想。简单来说，IoC 就是<strong>将你设计好了的对象交给对应的 IoC 进行控制，而不是传统的在你直接控制对象</strong>。</p><p>既然是控制反转，下面就来说说这控制和反转：</p><p>传统面向程序设计，我们直接通过 new 创建对象，是程序主动去创建依赖对象。IoC 则是有一个专门的容器来创建这些对象，即 IoC 容器来控制对象的创建，主要控制了外部资源获取。</p><p>有反就有正，传统面向程序设计是由我们自己在对象中主动获取依赖对象，也就是正转。而反转则是由容器来帮忙创建及注入依赖对象：容器帮我们查找及注入依赖对象，对象只是被动的接受依赖对象，所以是反转。</p><p><img src="/images/JavaEE-03/20200415120635.png" alt=""></p><h4 id="Spring-中的-IoC-容器"><a href="#Spring-中的-IoC-容器" class="headerlink" title="Spring 中的 IoC 容器"></a>Spring 中的 IoC 容器</h4><p>Spring中提供了两种 IoC 容器： <code>BeanFactory</code> 和 <code>ApplicationContext</code>。</p><p>其中 <code>ApplicationContext</code> 是 <code>BeanFactory</code> 的子类，<code>ApplicationContext</code> 是基于 <code>BeanFactory</code> 构建的，功能更强大，下面讲述均为 <code>ApplicationContext</code> 。</p><p>在 Spring MVC 中，IoC 容器为 <code>ApplicationContext</code> 接口。它负责实例化并配置和装配需要托管的对象。容器通过读取配置文件或者代码获取托管对象的描述信息。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> org.springframework.context;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.HierarchicalBeanFactory;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.ListableBeanFactory;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.config.AutowireCapableBeanFactory;</span><br><span class="line"><span class="keyword">import</span> org.springframework.core.env.EnvironmentCapable;</span><br><span class="line"><span class="keyword">import</span> org.springframework.core.io.support.ResourcePatternResolver;</span><br><span class="line"><span class="keyword">import</span> org.springframework.lang.Nullable;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">ApplicationContext</span> <span class="keyword">extends</span> <span class="title">EnvironmentCapable</span>, <span class="title">ListableBeanFactory</span>, <span class="title">HierarchicalBeanFactory</span>, <span class="title">MessageSource</span>, <span class="title">ApplicationEventPublisher</span>, <span class="title">ResourcePatternResolver</span> </span>&#123;</span><br><span class="line">    <span class="meta">@Nullable</span></span><br><span class="line">    <span class="function">String <span class="title">getId</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line">    <span class="function">String <span class="title">getApplicationName</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line">    <span class="function">String <span class="title">getDisplayName</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">long</span> <span class="title">getStartupDate</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Nullable</span></span><br><span class="line">    <span class="function">ApplicationContext <span class="title">getParent</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line">    <span class="function">AutowireCapableBeanFactory <span class="title">getAutowireCapableBeanFactory</span><span class="params">()</span> <span class="keyword">throws</span> IllegalStateException</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>容器的创建也提供了两种方法：</p><blockquote><p>Java 代码</p></blockquote><p>对于 <code>ApplicationContext</code> 接口，Spring 提供了 <code>ClassPathXmlApplicationContext</code> 或 <code>FileSystemXmlApplicationContext</code> 的实现类来创建你的 IoC 容器。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ApplicationContext context = <span class="keyword">new</span> ClassPathXmlApplicationContext(<span class="string">"test.xml"</span>);</span><br></pre></td></tr></table></figure><blockquote><p>WebApplicationContext</p></blockquote><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">listener</span>&gt;</span>  </span><br><span class="line">    <span class="tag">&lt;<span class="name">listener-class</span>&gt;</span>org.springframework.web.context.ContextLoaderListener<span class="tag">&lt;/<span class="name">listener-class</span>&gt;</span>  </span><br><span class="line"><span class="tag">&lt;/<span class="name">listener</span>&gt;</span></span><br></pre></td></tr></table></figure><p>在 Spring 中，配置好了监听器，在启动时会创建一个 <code>WebApplicationContext</code>，Spring 初始化的过程中会调用 <code>ContextLoader</code>中的 <code>initWebApplicationContext()</code> 方法生成一个 <code>WebApplicationContext</code>。</p><hr><h3 id="Bean-初始化"><a href="#Bean-初始化" class="headerlink" title="Bean 初始化"></a>Bean 初始化</h3><h4 id="Bean-的定义"><a href="#Bean-的定义" class="headerlink" title="Bean 的定义"></a>Bean 的定义</h4><p>在 Spring 中，Bean 是 IoC 容器管理的对象。在 Spring 中，一旦把一个 Bean 放入到 IoC容器之中，这个 Bean 的生命周期就会交给容器进行管理。</p><p>一个 Bean 的信息由他的<strong>元数据</strong>进行表示，下面展示了这些元数据：</p><table><thead><tr><th align="center">属性</th><th></th><th align="center">描述</th></tr></thead><tbody><tr><td align="center">Class</td><td></td><td align="center">指定用来创建 Bean 的类</td></tr><tr><td align="center">Name</td><td></td><td align="center">指定唯一的标识符</td></tr><tr><td align="center">Scope</td><td></td><td align="center">指定创建的对象的作用域</td></tr><tr><td align="center">Constructor arguments</td><td></td><td align="center">它是用来注入依赖关系的</td></tr><tr><td align="center">Properties</td><td></td><td align="center">用于依赖注入关系</td></tr><tr><td align="center">Autowiring mode</td><td></td><td align="center">用于自动装配协作的 Bean</td></tr><tr><td align="center">Lazy initialization mode</td><td></td><td align="center">延迟初始化，第一次被请求时才创建实例</td></tr><tr><td align="center">Initialization method</td><td></td><td align="center">所有必需的属性被设置后，调用回调方法</td></tr><tr><td align="center">Destruction method</td><td></td><td align="center">当容器被销毁时，使用回调方法</td></tr></tbody></table><h4 id="Bean-的作用域"><a href="#Bean-的作用域" class="headerlink" title="Bean 的作用域"></a>Bean 的作用域</h4><p>定义 Bean 的时候，你需要设置这个 Bean 的作用域，没有设置的话默认值为  <strong>singleton</strong>。</p><p>这里可以参考设计模式，常用的作用域为 <strong>prototype</strong> 和 <strong>singleton</strong>，前者为原型模式，后者为单例模式。</p><p>Spring 框架支持以下作用域：</p><ul><li><p>singleton</p><p>该作用域将 Bean 限制在每一个 Spring IoC 容器中的一个单一实例。该单一实例将存储在高速缓存中，以及所有后续的请求和引用都返回缓存对象。</p></li><li><p>prototype</p><p>该作用域将 Bean 限制在任意数量的对象实例。如果作用域设置为 prototype，那么每次发出请求时 Spring IoC 容器就创建对象的新的 Bean 实例。</p></li><li><p>request</p><p>该作用域将 Bean 的定义限制为 HTTP 请求。只有在 web 应用中才会生效。</p></li><li><p>session</p><p>该作用域将 Bean 的定义限制为 HTTP 请求。只有在 web 应用中才会生效。</p></li><li><p>application</p><p>该作用域将 Bean 的定义限制为 ServletContext。只有在 web 应用中才会生效。</p></li><li><p>websocket</p><p>该作用域将 Bean 的定义限制为 WebSocket。只有在 web 应用中才会生效。</p></li></ul><h4 id="Bean-的生命周期"><a href="#Bean-的生命周期" class="headerlink" title="Bean 的生命周期"></a>Bean 的生命周期</h4><p>这里引用一张 《Spring 解密》中的图片，对 Bean 的生命周期进行简单概括，具体细节可以阅读这本书（它真的讲的比我好）。</p><p><img src="/images/JavaEE-03/20200415130138.png" alt=""></p><hr><h3 id="MVC-的流程"><a href="#MVC-的流程" class="headerlink" title="MVC 的流程"></a>MVC 的流程</h3><ol><li>用户向服务器发送请求，请求被 Spring 的前端控制器 Servelt DispatcherServlet 捕获。这里前端控制器不会自己进行处理，而是对请求进行分发。</li><li>DispatcherServlet 对请求 URL 进行解析，得到请求资源标识符 URI。然后根据该URI，调用 <strong>HandlerMapping</strong> 获得该 Handler 配置的所有相关的对象（包括对象以及对应的拦截器），最后以 <strong>HandlerExecutionChain</strong> 对象的形式返回。</li></ol><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Nullable</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">final</span> HandlerExecutionChain <span class="title">getHandler</span><span class="params">(HttpServletRequest request)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">    Object handler = <span class="keyword">this</span>.getHandlerInternal(request);</span><br><span class="line">    <span class="keyword">if</span> (handler == <span class="keyword">null</span>) &#123;</span><br><span class="line">        handler = <span class="keyword">this</span>.getDefaultHandler();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (handler == <span class="keyword">null</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (handler <span class="keyword">instanceof</span> String) &#123;</span><br><span class="line">            String handlerName = (String)handler;</span><br><span class="line">            handler = <span class="keyword">this</span>.obtainApplicationContext().getBean(handlerName);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        HandlerExecutionChain executionChain = <span class="keyword">this</span>.getHandlerExecutionChain(handler, request);</span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">this</span>.logger.isTraceEnabled()) &#123;</span><br><span class="line">            <span class="keyword">this</span>.logger.trace(<span class="string">"Mapped to "</span> + handler);</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="keyword">this</span>.logger.isDebugEnabled() &amp;&amp; !request.getDispatcherType().equals(DispatcherType.ASYNC)) &#123;</span><br><span class="line">            <span class="keyword">this</span>.logger.debug(<span class="string">"Mapped to "</span> + executionChain.getHandler());</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">this</span>.hasCorsConfigurationSource(handler) || CorsUtils.isPreFlightRequest(request)) &#123;</span><br><span class="line">            CorsConfiguration config = <span class="keyword">this</span>.corsConfigurationSource != <span class="keyword">null</span> ? <span class="keyword">this</span>.corsConfigurationSource.getCorsConfiguration(request) : <span class="keyword">null</span>;</span><br><span class="line">            CorsConfiguration handlerConfig = <span class="keyword">this</span>.getCorsConfiguration(handler, request);</span><br><span class="line">            config = config != <span class="keyword">null</span> ? config.combine(handlerConfig) : handlerConfig;</span><br><span class="line">            executionChain = <span class="keyword">this</span>.getCorsHandlerExecutionChain(request, executionChain, config);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> executionChain;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="3"><li>DispatcherServlet 根据获得的 Handler，选择一个合适的 <strong>HandlerAdapter</strong>。这里使用了设计模式中的适配器模式，能够更容易的支持多种类型的处理器。</li></ol><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">protected</span> HandlerAdapter <span class="title">getHandlerAdapter</span><span class="params">(Object handler)</span> <span class="keyword">throws</span> ServletException </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>.handlerAdapters != <span class="keyword">null</span>) &#123;</span><br><span class="line">        Iterator var2 = <span class="keyword">this</span>.handlerAdapters.iterator();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span>(var2.hasNext()) &#123;</span><br><span class="line">            HandlerAdapter adapter = (HandlerAdapter)var2.next();</span><br><span class="line">            <span class="keyword">if</span> (adapter.supports(handler)) &#123;</span><br><span class="line">                <span class="keyword">return</span> adapter;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">throw</span> <span class="keyword">new</span> ServletException(<span class="string">"No adapter for handler ["</span> + handler + <span class="string">"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler"</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="4"><li>HandlerAdapter 将会根据适配的结果调用真正的功能处理方法，完成功能处理。</li><li>Handler 执行完成后，向 DispatcherServlet 返回一个 <strong>ModelAndView</strong> 对象然后调用拦截器的 postHandle 方法。</li><li>根据返回的 ModelAndView，选择一个适合的 <strong>ViewResolver</strong>（必须是已经注册到 Spring 容器中的 ViewResolver）返回给 DispatcherServlet。</li></ol><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> org.springframework.web.servlet;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Locale;</span><br><span class="line"><span class="keyword">import</span> org.springframework.lang.Nullable;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">ViewResolver</span> </span>&#123;</span><br><span class="line">    <span class="meta">@Nullable</span></span><br><span class="line">    <span class="function">View <span class="title">resolveViewName</span><span class="params">(String var1, Locale var2)</span> <span class="keyword">throws</span> Exception</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="7"><li><p>DispatcherServlet 将 ModelAndView 的逻辑视图名发送给 ViewResolver， ViewResolver 将把逻辑视图名解析为具体的 View。</p></li><li><p><strong>View</strong> 进行视图渲染，View 会根据传进来的 Model 模型数据进行渲染。</p></li><li><p>返回渲染后的结果。</p></li><li><p>执行拦截器的 <strong>afterCompletion</strong> 方法。</p></li></ol><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> org.springframework.web.servlet;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> org.springframework.lang.Nullable;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">HandlerInterceptor</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">default</span> <span class="keyword">boolean</span> <span class="title">preHandle</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">default</span> <span class="keyword">void</span> <span class="title">postHandle</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">default</span> <span class="keyword">void</span> <span class="title">afterCompletion</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex)</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="11"><li>返回控制权给 <strong>DispatcherServlet</strong>，由 DispatcherServlet 返回响应，流程结束。</li></ol><hr><h3 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h3><p>文章中的资料主要来自于 Spring 官网的文档，也参考了一些网络上的资料和书籍。</p><p>感谢阅读，如果有什么错误和建议，欢迎与我联系！</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Java-EE/">Java EE</category>
      
      
      <comments>https://ry.huaji.store/2020/04/JavaEE-03/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>编辑距离</title>
      <link>https://ry.huaji.store/2020/04/Leetcode-edit-distance/</link>
      <guid>https://ry.huaji.store/2020/04/Leetcode-edit-distance/</guid>
      <pubDate>Sun, 05 Apr 2020 17:50:24 GMT</pubDate>
      
        
        
      <description>&lt;h3 id=&quot;定义&quot;&gt;&lt;a href=&quot;#定义&quot; class=&quot;headerlink&quot; title=&quot;定义&quot;&gt;&lt;/a&gt;定义&lt;/h3&gt;&lt;p&gt;编辑距离（Edit Distance），又称 Levenshtein 距离。&lt;/p&gt;
&lt;p&gt;编辑距离是指两个字符串之间，由一个字符串转化为另</description>
        
      
      
      
      <content:encoded><![CDATA[<h3 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h3><p>编辑距离（Edit Distance），又称 Levenshtein 距离。</p><p>编辑距离是指两个字符串之间，由一个字符串转化为另一个字符串所需的<strong>最小</strong>编辑操作次数。</p><p>许可的编辑操作包括：</p><ul><li>在原串中添加一个字符</li><li>在原串中删除一个字符</li><li>在原串中修改一个字符</li></ul><hr><h3 id="解法"><a href="#解法" class="headerlink" title="解法"></a>解法</h3><p>解法当然是 DP 了！</p><p>先来看看操作，设原串为 A 新串为 B，A 串的长度为 n，B 串的长度为 m，那么现在就有对两个串的 6 种操作。</p><p>然而我们可以把操作简化为三种：</p><ul><li>在 A 中添加一个字符（等价于在 B 中删除一个字符）</li><li>在 B 中添加一个字符（等价于在 A 中删除一个字符）</li><li>在 A 中修改一个字符（等价于在 B 中修改一个字符） </li></ul><p>然后看看转移，这里用 <code>dp[i][j]</code> 表示 A 从头开始的 i 个字符与 B 从头开始的 j 个字符。</p><p><strong>i 和 j 为 0 的时候就表示空串。所以这个二维数组应该开到 <code>dp[n + 1][m + 1]</code> 。</strong></p><p>对于 <code>dp[i][j]</code> 可以由下面三种方式转移得到：</p><ul><li><p><code>dp[i - 1][j] + 1</code> 只需要在现有 A 串的末尾添加一个字符即可</p></li><li><p><code>dp[i][j - 1] + 1</code> 只需要在现有 B 串的末尾添加一个字符即可</p></li><li><p><code>dp[i - 1][j - 1] + (A[i - 1] == B[i - 1] ? 0 : 1)</code> 这里需要判断 A 串中第 i 个字符（下标 i - 1）和 B 串中第 j 个字符（下标 j - 1）是否相同。相同的话直接转移，不同的话需要把 A[i - 1] 修改为 B[j - 1]，因此编辑距离增加 1</p></li></ul><p>因此 <code>dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i][j] + (A[i - 1] == B[i - 1] ? 0 : 1))</code></p><p>最后看看边界条件，由于空串到任意一个串只需要不断加加加，一个串到空串只需要不断减减减，所以：</p><ul><li><code>dp[i][0] = i</code> 在 B 中添加 i 个字符</li><li><code>dp[0][j] = j</code> 在 A 中添加 j 个字符</li></ul><p>条件齐了，将 i 和 j 从 0 推到 n 和 m 即可，正推时所有前置条件都已经算完了。</p><p>时空复杂度均为 O(nm)。</p><hr><h3 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h3><p><a href="https://leetcode-cn.com/problems/edit-distance/" target="_blank" rel="noopener">Leetcode 72 编辑距离</a></p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">minDistance</span><span class="params">(<span class="built_in">string</span> word1, <span class="built_in">string</span> word2)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="function"><span class="built_in">vector</span>&lt;<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&gt; <span class="title">dp</span><span class="params">(word1.size() + <span class="number">1</span>, <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;(word2.size() + <span class="number">1</span>))</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; dp.size(); i++) dp[i][<span class="number">0</span>] = i;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> j = <span class="number">0</span>; j &lt; dp[<span class="number">0</span>].size(); j++) dp[<span class="number">0</span>][j] = j;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">1</span>; i &lt; dp.size(); i++)</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> j = <span class="number">1</span>; j &lt; dp[<span class="number">0</span>].size(); j++)</span><br><span class="line">dp[i][j] = min(&#123;</span><br><span class="line">dp[i - <span class="number">1</span>][j] + <span class="number">1</span>,</span><br><span class="line">dp[i][j - <span class="number">1</span>] + <span class="number">1</span>,</span><br><span class="line">dp[i - <span class="number">1</span>][j - <span class="number">1</span>] + (word1[i - <span class="number">1</span>] == word2[j - <span class="number">1</span>] ? <span class="number">0</span> : <span class="number">1</span>)</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> dp[word1.size()][word2.size()];</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Leetcode/">Leetcode</category>
      
      
      <comments>https://ry.huaji.store/2020/04/Leetcode-edit-distance/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Leetcode 300 最长上升子序列</title>
      <link>https://ry.huaji.store/2020/03/Leetcode-300/</link>
      <guid>https://ry.huaji.store/2020/03/Leetcode-300/</guid>
      <pubDate>Wed, 25 Mar 2020 17:46:42 GMT</pubDate>
      
        
        
      <description>&lt;blockquote&gt;
&lt;p&gt;LIS 老题目了，然而我忘了。。。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;动态规划&quot;&gt;&lt;a href=&quot;#动态规划&quot; class=&quot;headerlink&quot; title=&quot;动态规划&quot;&gt;&lt;/a&gt;动态规划&lt;/h3&gt;&lt;p&gt;直接 DP 问题不大</description>
        
      
      
      
      <content:encoded><![CDATA[<blockquote><p>LIS 老题目了，然而我忘了。。。</p></blockquote><h3 id="动态规划"><a href="#动态规划" class="headerlink" title="动态规划"></a>动态规划</h3><p>直接 DP 问题不大，注意一下给你的如果是个空数组就行了</p><p>对于位置 i ，dp[i] 表示以 nums[i] 结尾的 LIS 的长度</p><p>所以初始化 dp[i]=1, 1&lt;=i&lt;=n 毕竟每个位置自身就是长度为1的 LIS</p><p>对于位置 i ，dp[i] 一定是由前面的结尾的值小于 nums[i] 的位置转移过来的</p><p>所以 dp[i]=max(dp[j]+1), 1&lt;=j&lt;i, a[j]&lt;a[i]</p><p>O(n^2) 的时间， O(n) 的空间，最长不降子序列加等号就行</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">lengthOfLIS</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&amp; nums)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="function"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; <span class="title">dp</span><span class="params">(nums.size(), <span class="number">1</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; nums.size(); i++)</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> j = <span class="number">0</span>; j &lt; i; j++)</span><br><span class="line"><span class="keyword">if</span> (nums[i] &gt; nums[j]) dp[i] = max(dp[i], dp[j] + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">auto</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> it : dp) ans = max(ans, it);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><hr><h3 id="二分查找优化"><a href="#二分查找优化" class="headerlink" title="二分查找优化"></a>二分查找优化</h3><p>有一个题解是这样说的，道理是这个道理，然而我不知道为什么这样是对的：</p><blockquote><p>新建数组 cell，用于保存最长上升子序列<br>对原序列进行遍历，将每位元素二分插入 cell 中<br>如果 cell 中元素都比它小，将它插到最后<br>否则，用它覆盖掉比它大的元素中最小的那个。<br>总之，思想就是让 cell 中存储比较小的元素。这样，cell 未必是真实的最长上升子序列，但长度是对的。</p></blockquote><p>当然还有一个我能理解的办法，不然我也不会写这个东西了</p><p>这个办法的核心是维护一个数组，d[i] 表示长度为 i 的 LIS 的末尾元素的最小值，初始化 d[1]=nums[0] 。同时维护一个变量 len 标记目前的 LIS 长度.</p><p>遍历数组，对于每一个元素 nums[i]：</p><ul><li>如果这个元素大于已知的最长 LIS 的末尾元素，那么我们就找到了一个更长的 LIS ，因此 len++, d[len]=nums[i]</li><li>否则二分查找数组 d ，找到第一个比 nums[i] 小的位置 j，j 就是这个元素前面能用的最大 LIS 长度，d[j+1] 肯定是大于nums[i] ，那么现在长度为 j+1 的 LIS 末尾元素最小值就应该是 nums[i]，d[j+1]=nums[i]</li></ul><p>这样操作数组 d 肯定是单调的，所以可以用二分查找</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">lengthOfLIS</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&amp; nums)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (nums.empty()) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; <span class="title">d</span><span class="params">(nums.size() + <span class="number">1</span>, <span class="number">0</span>)</span></span>;</span><br><span class="line"><span class="keyword">auto</span> len = <span class="number">1</span>;</span><br><span class="line">d[<span class="number">1</span>] = nums[<span class="number">0</span>];</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> it : nums)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (it &gt; d[len])</span><br><span class="line">&#123;</span><br><span class="line">len++;</span><br><span class="line">d[len] = it;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> index = lower_bound(d.begin() + <span class="number">1</span>, d.begin() + <span class="number">1</span> + len, it) - d.begin();</span><br><span class="line">d[index] = it;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> len;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Leetcode/">Leetcode</category>
      
      
      <comments>https://ry.huaji.store/2020/03/Leetcode-300/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Leetcode 365 水壶问题</title>
      <link>https://ry.huaji.store/2020/03/Leetcode-365/</link>
      <guid>https://ry.huaji.store/2020/03/Leetcode-365/</guid>
      <pubDate>Mon, 23 Mar 2020 17:42:23 GMT</pubDate>
      
        
        
      <description>&lt;blockquote&gt;
&lt;p&gt;卡题了。。。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;方法一-暴力&quot;&gt;&lt;a href=&quot;#方法一-暴力&quot; class=&quot;headerlink&quot; title=&quot;方法一 暴力&quot;&gt;&lt;/a&gt;方法一 暴力&lt;/h3&gt;&lt;p&gt;暴力出奇迹！&lt;/p&gt;
&lt;p</description>
        
      
      
      
      <content:encoded><![CDATA[<blockquote><p>卡题了。。。</p></blockquote><h3 id="方法一-暴力"><a href="#方法一-暴力" class="headerlink" title="方法一 暴力"></a>方法一 暴力</h3><p>暴力出奇迹！</p><p>这题可以考虑 BFS 或者 DFS ，用一个 <code>unordered_set</code> 来记录当前l两个水壶水的状态</p><p>在任意一个时刻，你可以执行以下操作</p><ul><li>把 X 壶的水灌进 Y 壶，直至 Y 壶灌满或 X 壶倒空</li><li>把 Y 壶的水灌进 X 壶，直至 X 壶灌满或 Y 壶倒空</li><li>把 X 壶灌满</li><li>把 Y 壶灌满</li><li>把 X 壶倒空</li><li>把 Y 壶倒空</li></ul><p>然而这个办法并不推荐，时间和空间都太大了</p><hr><h3 id="方法二-扩展-GCD"><a href="#方法二-扩展-GCD" class="headerlink" title="方法二 扩展 GCD"></a>方法二 扩展 GCD</h3><p>然后就是这题的正解，说是扩展 GCD ，其实就是裴蜀等式</p><p>先考虑一下方法一里面的操作，其实有两个操作是没有提到的：</p><ul><li>把一个不空的水壶倒空</li><li>把一个不满的水壶装满</li></ul><p>然而，你是不会做这两个操作的。这两个操作相当与你把之前的操作直接抹掉了</p><p>然后两个壶里面互相倒其实是不会对总量发生改变的</p><p>我们可以认为每次操作只会给水的总量带来正负 x 或者正负 y 的变化量</p><p>因此我们要找到一对整数 (a, b)，使得 ax+by=z 有解即可</p><p>还有一点是 z&lt;=x+y ，毕竟壶就这么大</p><p>然后摸出裴蜀等式：</p><p>对任意两个整数 a, b ，关于未知数x和y的线性丢番图方程（裴蜀等式） ax+by=m</p><p>当且仅当 m 是 gcd(a,b) 的倍数时有整数解 (x,y) 。裴蜀等式有解时必然有无穷多个解。</p><p>推论： a,b 互质时使得 ax+by=1 有解（充要条件）</p><p>所以只需要找到 gcd(x, y) 并判断 z 是否是它的倍数即可</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">canMeasureWater</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y, <span class="keyword">int</span> z)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (z &gt; x + y) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">if</span> (z == x || z == y) <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">if</span> (x == <span class="number">0</span> || y == <span class="number">0</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">return</span> z % gcd(x, y) == <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><hr><h3 id="方法三-动态规划"><a href="#方法三-动态规划" class="headerlink" title="方法三 动态规划"></a>方法三 动态规划</h3><p>没想到吧！这也能 DP ！</p><p>其实原理和方法二一样的</p><p>现在我们能有无限个 x 升和 y 升，因此我们还能有无限个 -x 升和 -y 升</p><p>然后摸出 <a href="https://leetcode-cn.com/problems/coin-change/" target="_blank" rel="noopener">Leetcode 322 零钱兑换</a> 的代码，改一改扔进去跑就行</p><p>也就是根据这四个零钱拼出来 z 的总额</p><p>代码复用大成功！</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Leetcode/">Leetcode</category>
      
      
      <comments>https://ry.huaji.store/2020/03/Leetcode-365/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>单调队列与单调栈</title>
      <link>https://ry.huaji.store/2020/03/Leetcode-stack/</link>
      <guid>https://ry.huaji.store/2020/03/Leetcode-stack/</guid>
      <pubDate>Wed, 18 Mar 2020 17:39:07 GMT</pubDate>
      
        
        
      <description>&lt;blockquote&gt;
&lt;p&gt;个人觉得虽然单调栈和单调队列都单调，但是用法和适用的问题却大相径庭。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;单调队列&quot;&gt;&lt;a href=&quot;#单调队列&quot; class=&quot;headerlink&quot; title=&quot;单调队列&quot;&gt;&lt;/a&gt;单调队列&lt;</description>
        
      
      
      
      <content:encoded><![CDATA[<blockquote><p>个人觉得虽然单调栈和单调队列都单调，但是用法和适用的问题却大相径庭。</p></blockquote><h3 id="单调队列"><a href="#单调队列" class="headerlink" title="单调队列"></a>单调队列</h3><p>单调队列是指一个队列内部元素具有单调性的数据结构，分为单调递增队列和单调递减队列。</p><p>单调队列满足三个性质：</p><ul><li>单调队列也是队列，满足先进先出</li><li>单调队列必须满足从队头到队尾的单调性</li><li>排在队列前面的元素比排在队列后面的元素要先进队</li></ul><p>假设一个队列 <code>&lt;– 0 1 3 1 2 5 &lt;–</code>，简单的理解的话 <code>1 2</code> 这一段对于整个队列的最大值是没有影响的，因为 <code>1 2</code> 先出队，且出队的时候最大值不会变，还是 5 ，所以 <code>1 2</code> 可以直接去掉。</p><p>对于单调递增队列，对于一个元素如果它大于等于队尾元素， 那么直接把元素进队， 如果这个元素小于队尾元素，则将队尾元素出队列，直到满足这个元素大于等于队尾元素。</p><p>对于单调递减队列，对于一个元素如果它小于等于队尾元素， 那么直接把元素进队， 如果这个元素大于队尾元素，则将队尾元素出队列，直到满足这个元素小于等于队尾元素。</p><p>这里我没有强调严格的单调性，因为我认为不递减或不递增是可行的，这个问题要因题目而异。大多数严格的情况下，不加等号的情况下需要保留下标；不是严格的话数据会有冗余，这个要自己取舍~~</p><p>实现的话推荐双端队列实现。单调队列应用：</p><ul><li>均摊 O(1) 的可以获得最大值的队列</li><li>优化 DP</li><li>给定一个数列，求长度为 m 的子串（滑动窗口）的最大值或最小值</li><li>查询区间最大值或者最小值</li></ul><hr><h3 id="单调栈"><a href="#单调栈" class="headerlink" title="单调栈"></a>单调栈</h3><p>单调栈是指一个栈内部元素具有单调性的数据结构，分为单调递增栈和单调递减栈。</p><p>单调栈满足三个性质：</p><ul><li>单调栈也是栈，满足先进后出。</li><li>单调栈必须满足从栈顶到栈底的单调性</li><li>排在栈越下面的元素比排在栈上面的元素要先进栈</li></ul><p>栈的实现和队列一模一样，插入模式一样，只有弹出方式不一样。</p><p>对于单调递增栈（从栈底到栈顶单调递增），应用：</p><ul><li>对于一个元素<ul><li>求左边第一个比它小的数</li><li>求左边第一个比它大的数</li><li>求右边第一个比他小的数</li><li>这些数的距离</li></ul></li><li>最长的单调区间</li><li>某个数为最值的最长区间</li></ul><p>此外，当访问到第 i 个元素时，单调栈维护的区间为 [0, i) ，而单调队列维护的区间为 (last_pop, i)。</p><hr><h3 id="单调队列题目"><a href="#单调队列题目" class="headerlink" title="单调队列题目"></a>单调队列题目</h3><p><a href="https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/" target="_blank" rel="noopener">Leetcode 面试题59 - II 队列的最大值</a></p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MaxQueue</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="comment">// MaxQueue() &#123;&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">max_value</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (deq.empty() || que.empty()) <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> deq.front();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">push_back</span><span class="params">(<span class="keyword">int</span> value)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">que.push(value);</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> ((!deq.empty()) &amp;&amp; value &gt; deq.back()) deq.pop_back();</span><br><span class="line">deq.push_back(value);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">pop_front</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (deq.empty() || que.empty()) <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> now = que.front();</span><br><span class="line">que.pop();</span><br><span class="line"><span class="keyword">if</span> (now == deq.front()) deq.pop_front();</span><br><span class="line"><span class="keyword">return</span> now;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="built_in">queue</span>&lt;<span class="keyword">int</span>&gt; que;</span><br><span class="line"><span class="built_in">deque</span>&lt;<span class="keyword">int</span>&gt; deq;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Your MaxQueue object will be instantiated and called as such:</span></span><br><span class="line"><span class="comment"> * MaxQueue* obj = new MaxQueue();</span></span><br><span class="line"><span class="comment"> * int param_1 = obj-&gt;max_value();</span></span><br><span class="line"><span class="comment"> * obj-&gt;push_back(value);</span></span><br><span class="line"><span class="comment"> * int param_3 = obj-&gt;pop_front();</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure><p><a href="https://leetcode-cn.com/problems/sliding-window-maximum/" target="_blank" rel="noopener">Leetcode 239 滑动窗口最大值</a></p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="built_in">deque</span>&lt;<span class="keyword">int</span>&gt;&amp; deq, <span class="keyword">int</span> num)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">while</span> ((!deq.empty()) &amp;&amp; (num &gt; deq.back())) deq.pop_back();</span><br><span class="line"></span><br><span class="line">deq.push_back(num);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; <span class="title">maxSlidingWindow</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&amp; nums, <span class="keyword">int</span> k)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (k == <span class="number">0</span>) <span class="keyword">return</span> &#123;&#125;;</span><br><span class="line"></span><br><span class="line"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; ans;</span><br><span class="line"></span><br><span class="line"><span class="built_in">deque</span>&lt;<span class="keyword">int</span>&gt; deq;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; k; i++) add(deq, nums[i]);</span><br><span class="line">ans.emplace_back(deq.front());</span><br><span class="line"><span class="keyword">auto</span> now = k;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (now &lt; nums.size())</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (deq.front() == nums[now - k]) deq.pop_front();</span><br><span class="line">add(deq, nums[now]);</span><br><span class="line">ans.emplace_back(deq.front());</span><br><span class="line">now++;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><hr><h3 id="单调栈题目"><a href="#单调栈题目" class="headerlink" title="单调栈题目"></a>单调栈题目</h3><p><a href="https://leetcode-cn.com/problems/largest-rectangle-in-histogram/" target="_blank" rel="noopener">Leetcode 84 柱状图中最大的矩形</a></p><p>目标：对于每一个元素找到左右第一个比他小的元素</p><p>当元素一个出栈时，进行比较的新元素是这个元素右边第一个比他小的元素</p><p>当元素一个出栈后，新的栈顶元素是这个元素左边第一个比他小的元素</p><p>还有，前面和后面记得塞一个0</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">largestRectangleArea</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&amp; heights)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="function"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; <span class="title">h</span><span class="params">(heights.size() + <span class="number">2</span>, <span class="number">0</span>)</span></span>;</span><br><span class="line">copy(heights.begin(), heights.end(), h.begin() + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">auto</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">stack</span>&lt;<span class="keyword">int</span>&gt; s;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; h.size(); i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">while</span> ((!s.empty()) &amp;&amp; (h[i] &lt; h[s.top()]))</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> now = h[s.top()];</span><br><span class="line">s.pop();</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> L = s.top(), R = i;</span><br><span class="line">ans = max(ans, now * (R - L - <span class="number">1</span>));</span><br><span class="line">&#125;</span><br><span class="line">s.push(i);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Leetcode/">Leetcode</category>
      
      
      <comments>https://ry.huaji.store/2020/03/Leetcode-stack/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Java EE 02：基于 MySQL+Tomcat+Servlet+JSP 的简单作业管理系统</title>
      <link>https://ry.huaji.store/2020/03/JavaEE-02/</link>
      <guid>https://ry.huaji.store/2020/03/JavaEE-02/</guid>
      <pubDate>Thu, 12 Mar 2020 08:33:26 GMT</pubDate>
      
        
        
      <description>&lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;本文将介绍一个基于 MySQL+Tomcat+Servlet+JSP 的简单作业管理系统&lt;/p&gt;
&lt;p&gt;Git 仓库地址：&lt;a href=&quot;</description>
        
      
      
      
      <content:encoded><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>本文将介绍一个基于 MySQL+Tomcat+Servlet+JSP 的简单作业管理系统</p><p>Git 仓库地址：<a href="https://github.com/dongshunyao/HomeworkManagement" target="_blank" rel="noopener">HomeworkManagement</a></p><p>开源许可证采用 <code>Apache-2.0</code></p><hr><h3 id="功能介绍"><a href="#功能介绍" class="headerlink" title="功能介绍"></a>功能介绍</h3><p>这个项目是为学生和教师设计的简易的作业的提交和管理平台，暂时不用考虑权限问题</p><p>对于教师，有以下功能：</p><ul><li>添加学生</li><li>查看学生</li><li>添加作业</li><li>查看作业</li><li>查看已提交的作业</li></ul><p>对于学生，有以下功能：</p><ul><li>查看作业</li><li>提交作业</li></ul><hr><h3 id="系统演示"><a href="#系统演示" class="headerlink" title="系统演示"></a>系统演示</h3><p>启动后首先进入首页，这里的首页是 <code>index.jsp</code>，你需要选择自己的角色</p><p><img src="/images/JavaEE-02/20200313105948.png" alt=""></p><hr><h4 id="我是教师"><a href="#我是教师" class="headerlink" title="我是教师"></a>我是教师</h4><p>选择 <code>我是教师</code> 将进入教师主页，系统会列出所有可以进行的操作</p><p><img src="/images/JavaEE-02/20200313110137.png" alt=""></p><blockquote><p>添加作业</p></blockquote><p>选择 <code>添加作业</code> 将弹出新窗口进入作业的添加页面，教师可以在这里发布新的作业</p><p><img src="/images/JavaEE-02/20200313111651.png" alt=""></p><p>其中所有选项必填，提交后会返回到服务器和数据库，并返回结果</p><p><img src="/images/JavaEE-02/20200313110917.png" alt=""></p><blockquote><p>添加学生</p></blockquote><p>选择 <code>添加学生</code> 将弹出新窗口进入学生的添加页面，教师可以在这里添加新的学生</p><p><img src="/images/JavaEE-02/20200313111039.png" alt=""></p><p>如果学号已经存在，提交后将返回错误提示</p><p><img src="/images/JavaEE-02/20200313111710.png" alt=""></p><blockquote><p>查看学生列表</p></blockquote><p>选择 <code>查看学生列表</code> 将弹出新窗口进入学生的展示页面，这里展示了所有的学生，点击下方可以添加学生</p><p><img src="/images/JavaEE-02/20200313112151.png" alt=""></p><blockquote><p>查看作业列表</p></blockquote><p>选择 <code>查看作业列表</code> 将弹出新窗口进入作业的展示页面，这里展示了所有发布的作业，点击下方可以添加作业</p><p><img src="/images/JavaEE-02/20200313112506.png" alt=""></p><p>点击作业右边的<code>查看</code>可以查看对应作业所有的提交情况</p><p><img src="/images/JavaEE-02/20200313112617.png" alt=""></p><hr><h4 id="我是学生"><a href="#我是学生" class="headerlink" title="我是学生"></a>我是学生</h4><p>从主页进入学生主页</p><p><img src="/images/JavaEE-02/20200313112830.png" alt=""></p><blockquote><p>查看作业列表</p></blockquote><p>这里可以查看所有发布的作业，点击相应的按钮即可提交</p><p><img src="/images/JavaEE-02/20200313113512.png" alt=""></p><p><img src="/images/JavaEE-02/20200313113606.png" alt=""></p><p>点击提交后会查询数据库判断输入的合法性，并返回结果</p><p><img src="/images/JavaEE-02/20200313113658.png" alt=""></p><p><img src="/images/JavaEE-02/20200313113758.png" alt=""></p><hr><h3 id="系统设计与源码分析"><a href="#系统设计与源码分析" class="headerlink" title="系统设计与源码分析"></a>系统设计与源码分析</h3><h4 id="系统架构与设计"><a href="#系统架构与设计" class="headerlink" title="系统架构与设计"></a>系统架构与设计</h4><p><img src="/images/JavaEE-02/20200313130410.png" alt=""></p><hr><h4 id="数据库"><a href="#数据库" class="headerlink" title="数据库"></a>数据库</h4><p>数据库一共有三张表，具体内容可以参考源码中的 <code>hwm.sql</code> 文件</p><p><img src="/images/JavaEE-02/20200313113945.png" alt=""></p><hr><h4 id="实体类"><a href="#实体类" class="headerlink" title="实体类"></a>实体类</h4><p>所有的实体类位于 <code>package com.hwm.model</code>，每个实体类对应数据库的一张表，并添加了 <code>get</code> 和 <code>set</code> 方法，这里不再赘述</p><hr><h4 id="数据库连接件"><a href="#数据库连接件" class="headerlink" title="数据库连接件"></a>数据库连接件</h4><p>所有的实体类位于 <code>package com.hwm.jdbc</code></p><p>这里为项目添加了 <code>Maven</code> 用于管理依赖，<code>mysql-connector</code> 也在其中，使用源码的时候需要在 <code>Project Structure -&gt; Artifacts -&gt; Output Layout -&gt; WEV-INF</code> 中添加 <code>lib</code>目录并添加依赖</p><p>其中，<code>JdbcConnection</code> 维护了一个单例类，用于保存与数据库的连接</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hwm.jdbc;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.sql.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">JdbcConnection</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> JdbcConnection jdbcConnection;</span><br><span class="line">    <span class="keyword">private</span> Connection connection;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> JdbcConnection <span class="title">getInstance</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (jdbcConnection == <span class="keyword">null</span>) &#123;</span><br><span class="line">            jdbcConnection = <span class="keyword">new</span> JdbcConnection();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> jdbcConnection;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="title">JdbcConnection</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">final</span> String url = <span class="string">"jdbc:mysql://localhost:3306/hwm?serverTimezone=GMT%2B8"</span>;</span><br><span class="line">        <span class="keyword">final</span> String driverName = <span class="string">"com.mysql.cj.jdbc.Driver"</span>;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            Class.forName(driverName);</span><br><span class="line">            connection = DriverManager.getConnection(url, <span class="string">"root"</span>, <span class="string">"19990326"</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (SQLException | ClassNotFoundException e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Connection <span class="title">getConnection</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> connection;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>HomeworkJdbc</code>, <code>StudentJdbc</code>, <code>SubmitHomeworkJdbc</code> 分别对应了三张表在数据库中的操作方法</p><hr><h4 id="Servlet"><a href="#Servlet" class="headerlink" title="Servlet"></a>Servlet</h4><p>Servlet 共分为两个部分，分别是 <code>package com.hwm.servlet.student</code> 和 <code>package com.hwm.servlet.teacher</code> ，分别用于处理教师和学生的请求</p><p>所有的类都继承自 <code>HttpServlet</code> ，并采用 <code>@WebServlet</code> 注解进行映射</p><p>具体的跳转实现请参考上文，源码就不再赘述</p><hr><h4 id="JSP"><a href="#JSP" class="headerlink" title="JSP"></a>JSP</h4><p>所有的 前端页面均采用 JSP ，位于 <code>web</code> 目录下，页面跳转请参考上文</p><p><code>index.jsp</code> 为系统主页，<code>return.jsp</code> 为处理结果的返回页面</p><p><code>teacher</code> 目录包含教师的主页与所有相关页面，<code>student</code> 目录包含学生的主页与所有相关页面</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Java-EE/">Java EE</category>
      
      
      <comments>https://ry.huaji.store/2020/03/JavaEE-02/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Leetcode 206 反转链表</title>
      <link>https://ry.huaji.store/2020/03/Leetcode-206/</link>
      <guid>https://ry.huaji.store/2020/03/Leetcode-206/</guid>
      <pubDate>Sat, 07 Mar 2020 17:33:41 GMT</pubDate>
      
        
        
      <description>&lt;h3 id=&quot;解题思路&quot;&gt;&lt;a href=&quot;#解题思路&quot; class=&quot;headerlink&quot; title=&quot;解题思路&quot;&gt;&lt;/a&gt;解题思路&lt;/h3&gt;&lt;p&gt;这题主要就两个办法，迭代和递归&lt;/p&gt;
&lt;p&gt;迭代的好处是 O(1) 的空间，毕竟递归需要 O(n) 的栈空间&lt;/p&gt;
&lt;p</description>
        
      
      
      
      <content:encoded><![CDATA[<h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><p>这题主要就两个办法，迭代和递归</p><p>迭代的好处是 O(1) 的空间，毕竟递归需要 O(n) 的栈空间</p><p>递归的好处就是不用保存中间变量</p><hr><h3 id="迭代"><a href="#迭代" class="headerlink" title="迭代"></a>迭代</h3><p>简单来说就是<code>head</code>指针和<code>newList</code>指针一前一后同时向前推进，保存一下<code>head</code>的下一个元素，然后让<code>head</code>指向<code>newList</code>，然后向前推进，这里记得先推进<code>newList</code></p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function">ListNode* <span class="title">reverseList</span><span class="params">(ListNode* head)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">ListNode* newList = <span class="literal">nullptr</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (head != <span class="literal">nullptr</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">auto</span> temp = head-&gt;next;</span><br><span class="line">head-&gt;next = newList;</span><br><span class="line">newList = head;</span><br><span class="line">head = temp;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> newList;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><hr><h3 id="递归"><a href="#递归" class="headerlink" title="递归"></a>递归</h3><p>递归的核心是抓住每次递归的返回值是恒定的，是新链表的头结点。。</p><p>先通过递归找到新链表的头结点<code>newList</code>并返回，每次递归做的其实是将还未添加到新链表的最后一个节点添加到新链表中</p><p>因为不知道新链表的尾节点，所以采用<code>head-&gt;next</code>表示这个尾节点，下面第10行就是将新链表的尾节点指向旧链表的最后一个节点<code>head</code>，然后把新链表的尾节点置空</p><p>有一个坑就是处理一下空链表，<code>head</code>需要先判空</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function">ListNode* <span class="title">reverseList</span><span class="params">(ListNode* head)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (head == <span class="literal">nullptr</span> || head-&gt;next == <span class="literal">nullptr</span>)</span><br><span class="line"><span class="keyword">return</span> head;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> newList = reverseList(head-&gt;next);</span><br><span class="line">head-&gt;next-&gt;next = head;</span><br><span class="line">head-&gt;next = <span class="literal">nullptr</span>;</span><br><span class="line"><span class="keyword">return</span> newList;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Leetcode/">Leetcode</category>
      
      
      <comments>https://ry.huaji.store/2020/03/Leetcode-206/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Java EE 01：从零开始搭建 Java EE 项目</title>
      <link>https://ry.huaji.store/2020/03/JavaEE-01/</link>
      <guid>https://ry.huaji.store/2020/03/JavaEE-01/</guid>
      <pubDate>Tue, 03 Mar 2020 15:12:10 GMT</pubDate>
      
        
        
      <description>&lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;这是 Java EE 系列的第一篇博文。本文将手把手教你如何新建一个属于你的 Java EE 项目&lt;/p&gt;
&lt;p&gt;本文基于 Windows </description>
        
      
      
      
      <content:encoded><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>这是 Java EE 系列的第一篇博文。本文将手把手教你如何新建一个属于你的 Java EE 项目</p><p>本文基于 Windows 10 系统，下面将从 JDK、Tomcat、MySQL 的安装与配置开始，一步步的进行说明，有任何问题或建议欢迎与我联系XD</p><hr><h3 id="安装与配置-Java-环境"><a href="#安装与配置-Java-环境" class="headerlink" title="安装与配置 Java 环境"></a>安装与配置 Java 环境</h3><p>这里选择了 OpenJDK 12，大家可以自行到 <a href="http://jdk.java.net" target="_blank" rel="noopener">OpenJDK 官网</a> 下载你喜欢的相应系统版本的 JDK</p><p>下载压缩包后解压，这里选择将文件放在了 <code>C:\x86\openjdk\jdk-12.0.2</code></p><p><img src="/images/JavaEE-01/20200303213308.png" alt="JDK 路径"></p><p>接下来是配置系统环境变量，转到 <code>控制面板 &gt; 系统 &gt; 高级系统设置 &gt; 高级 &gt; 环境变量</code></p><ul><li>在系统变量中添加 <code>JAVA_HOME</code></li></ul><p><img src="/images/JavaEE-01/20200303215958.png" alt="JAVA_HOME"></p><ul><li>在系统变量 <code>PATH</code> 中添加 <code>%JAVA_HOME%\bin</code></li></ul><p>完成后可以通过在命令提示符中执行 <code>java --version</code> 和 <code>javac --version</code> 验证安装</p><hr><h3 id="安装与配置-Tomcat"><a href="#安装与配置-Tomcat" class="headerlink" title="安装与配置 Tomcat"></a>安装与配置 Tomcat</h3><p>这里选择了 Tomcat 9.0.31，可以从 <a href="http://tomcat.apache.org" target="_blank" rel="noopener">Tomcat 官网</a> 下载</p><p>下载压缩包后解压，这里选择将文件放在了 <code>C:\x86\apache-tomcat-9.0.31</code></p><p><img src="/images/JavaEE-01/20200303221540.png" alt="Tomcat"></p><p>根据目录下的 <code>RUNNING.txt</code> 的指引，在系统变量中添加 <code>CATALINA_HOME</code> ，并在系统变量 <code>PATH</code> 中添加 <code>%CATALINA_HOME%\bin</code></p><p><img src="/images/JavaEE-01/20200303222153.png" alt="CATALINA_HOME"></p><p>完成后运行 <code>bin\startup.bat</code> 验证安装</p><p><img src="/images/JavaEE-01/20200303222841.png" alt="Tomcat"></p><p>如果控制台出现乱码，打开 <code>conf\logging.properties</code> ，修改</p><figure class="highlight properties"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">java.util.logging.ConsoleHandler.encoding</span> = <span class="string">UTF-8</span></span><br></pre></td></tr></table></figure><p>为</p><figure class="highlight properties"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">java.util.logging.ConsoleHandler.encoding</span> = <span class="string">GBK</span></span><br></pre></td></tr></table></figure><hr><h3 id="安装与配置-MySQL"><a href="#安装与配置-MySQL" class="headerlink" title="安装与配置 MySQL"></a>安装与配置 MySQL</h3><p>MySQL 方面选择了 MySQL Community Server 8.0.19，可以从 <a href="https://dev.mysql.com/downloads/mysql" target="_blank" rel="noopener">MySQL 官网</a> 下载 <del>（打不开不要问我怎么办，我这办法也不可能写出来啊2333）</del></p><p>记得在 <a href="https://dev.mysql.com/downloads/connector/j" target="_blank" rel="noopener">这里</a> 下载与 MySQL 版本对应 MySQL Connector，后面会用到</p><p>下载压缩包后解压，这里选择将文件放在了 <code>C:\x86\mysql-8.0.19-winx64</code></p><p>在目录下新建 <code>my.ini</code>，填入以下内容，注意更改 <code>basedir</code></p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[mysql]</span></span><br><span class="line"><span class="attr">default-character-set</span> = utf8</span><br><span class="line"> </span><br><span class="line"><span class="section">[mysqld]</span></span><br><span class="line"><span class="attr">port</span> = <span class="number">3306</span></span><br><span class="line"><span class="attr">basedir</span> = C:\\x86\\mysql-<span class="number">8.0</span>.<span class="number">19</span>-winx64</span><br><span class="line"><span class="attr">max_connections</span> = <span class="number">20</span></span><br><span class="line"><span class="attr">character-set-server</span> = utf8</span><br><span class="line"><span class="attr">default-storage-engine</span> = INNODB</span><br></pre></td></tr></table></figure><p>在 <code>bin</code>目录下打开命令提示符，执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mysqld --initialize --console</span><br></pre></td></tr></table></figure><p>控制台将输出 <code>root</code> 用户的默认密码</p><p><img src="/images/JavaEE-01/20200303230408.png" alt="mysqld"></p><p>执行安装并启动服务，记得使用管理员权限运行命令提示符</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mysqld install</span><br><span class="line">net start mysql</span><br></pre></td></tr></table></figure><p>现在为止 MySQL 就已经安装完成了，你可以将 <code>C:\x86\mysql-8.0.19-winx64\bin</code> 添加到系统变量 <code>PATH</code> 中</p><p>接下来讲讲登录 MySQL 与修改密码</p><p>命令提示符使用以下命令进行登录</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mysql -u root -p</span><br></pre></td></tr></table></figure><p><img src="/images/JavaEE-01/20200303231253.png" alt="mysql login"></p><p>设置新密码，以密码 <code>123456</code> 为例</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">user</span> <span class="string">'root'</span>@<span class="string">'localhost'</span> <span class="keyword">IDENTIFIED</span> <span class="keyword">BY</span> <span class="string">'123456'</span>;</span><br></pre></td></tr></table></figure><p>修改后重新登录即可</p><hr><h3 id="创建-Java-EE-项目"><a href="#创建-Java-EE-项目" class="headerlink" title="创建 Java EE 项目"></a>创建 Java EE 项目</h3><p>使用 IntelliJ IDEA 创建项目</p><p>Project SDK 和 Application Server 选择刚刚安装的 JDK 和 Tomcat ，下面选择 Web Application (4.0)</p><p><img src="/images/JavaEE-01/20200303234234.png" alt=""></p><p>然后选择路径，结束，进入主界面</p><p><img src="/images/JavaEE-01/20200303234639.png" alt=""></p><p>我们可以修改一下 <code>index.jsp</code> ，加一点自己的东西进去，用于测试项目是否成功创建</p><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&lt;%@ page contentType=<span class="string">"text/html;charset=UTF-8"</span> language=<span class="string">"java"</span> %&gt;</span><br><span class="line">&lt;html&gt;</span><br><span class="line">  &lt;head&gt;</span><br><span class="line">    &lt;title&gt;$Title$&lt;/title&gt;</span><br><span class="line">  &lt;/head&gt;</span><br><span class="line">  &lt;body&gt;</span><br><span class="line">  &lt;h1&gt; Test Java EE&lt;/h1&gt;</span><br><span class="line">  &lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br></pre></td></tr></table></figure><p>编译并运行，成功的话会直接弹出浏览器并打开网页</p><p><img src="/images/JavaEE-01/20200303235901.png" alt=""></p><hr><h3 id="连接-MySQL-并测试"><a href="#连接-MySQL-并测试" class="headerlink" title="连接 MySQL 并测试"></a>连接 MySQL 并测试</h3><h4 id="添加-MySQL-Connector-JDBC"><a href="#添加-MySQL-Connector-JDBC" class="headerlink" title="添加 MySQL Connector (JDBC)"></a>添加 MySQL Connector (JDBC)</h4><p>在 <code>WEB-INF</code> 目录下新建两个目录，其中 <code>classes</code> 用于存放编译后的 class 文件，<code>lib</code> 用于存放使用到的 jar 包</p><p>解压在下载 MySQL 时下载的 MySQL Connector，获得一个 jar 包，这里的是 <code>mysql-connector-java-8.0.19.jar</code></p><p>将 jar 包移动到 <code>lib</code> 目录下，并在 IDEA 的 <code>File -&gt; Project Settings -&gt; Libraries</code> 中添加这个包</p><p><img src="/images/JavaEE-01/20200304002846.png" alt=""></p><h4 id="编写代码并测试"><a href="#编写代码并测试" class="headerlink" title="编写代码并测试"></a>编写代码并测试</h4><p>为了方便测试，这里预先在安装的 MySQL 中新建了一个数据库 <code>test</code>，并在其中新建了一个表 <code>t</code> 表仅一个字段 <code>id</code> ，类型为 <code>int</code></p><p>这里直接在 <code>src</code> 目录下新建一个 Java class ，名为 <code>Test</code> ，代码如下</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.sql.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Test</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">        testMysql();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">testMysql</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">final</span> String url = <span class="string">"jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8"</span>;</span><br><span class="line">        <span class="keyword">final</span> String driverName = <span class="string">"com.mysql.cj.jdbc.Driver"</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="comment">// 加载驱动</span></span><br><span class="line">            Class.forName(driverName);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 创建连接并获取 statement</span></span><br><span class="line">            Connection connection = DriverManager.getConnection(url, <span class="string">"root"</span>, <span class="string">"123456"</span>);</span><br><span class="line">            Statement statement = connection.createStatement();</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 插入两个数据</span></span><br><span class="line">            statement.executeUpdate(<span class="string">"INSERT INTO t VALUES (2333)"</span>);</span><br><span class="line">            statement.executeUpdate(<span class="string">"INSERT INTO t VALUES (337845818)"</span>);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 查询数据库</span></span><br><span class="line">            <span class="keyword">var</span> resultSet = statement.executeQuery(<span class="string">"SELECT * FROM t"</span>);</span><br><span class="line">            <span class="keyword">while</span> (resultSet.next()) &#123;</span><br><span class="line">                System.out.println(resultSet.getInt(<span class="number">1</span>));</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            connection.close();</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>输出结果如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">2333</span><br><span class="line">337845818</span><br></pre></td></tr></table></figure><p><img src="/images/JavaEE-01/20200304005238.png" alt=""></p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Java-EE/">Java EE</category>
      
      
      <comments>https://ry.huaji.store/2020/03/JavaEE-01/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Leetcode 225 用队列实现栈</title>
      <link>https://ry.huaji.store/2020/03/Leetcode-225/</link>
      <guid>https://ry.huaji.store/2020/03/Leetcode-225/</guid>
      <pubDate>Sun, 01 Mar 2020 17:29:12 GMT</pubDate>
      
        
        
      <description>&lt;h3 id=&quot;解题思路&quot;&gt;&lt;a href=&quot;#解题思路&quot; class=&quot;headerlink&quot; title=&quot;解题思路&quot;&gt;&lt;/a&gt;解题思路&lt;/h3&gt;&lt;h4 id=&quot;方法一-双队列-O-1-push-O-n-pop&quot;&gt;&lt;a href=&quot;#方法一-双队列-O-1-push-O-n-</description>
        
      
      
      
      <content:encoded><![CDATA[<h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><h4 id="方法一-双队列-O-1-push-O-n-pop"><a href="#方法一-双队列-O-1-push-O-n-pop" class="headerlink" title="方法一 双队列 O(1) push O(n) pop"></a>方法一 双队列 O(1) push O(n) pop</h4><p>进的时候直接进，没啥要求</p><p>出的时候需要弹出最后进入的那个元素，因此把这个元素之前的所有元素逐个弹出并放入空队列，最后弹出这个元素</p><p>这个方法对<code>top()</code>操作极不友好。。</p><h4 id="方法二-双队列-O-n-push-O-1-pop"><a href="#方法二-双队列-O-n-push-O-1-pop" class="headerlink" title="方法二 双队列 O(n) push $O(1) pop"></a>方法二 双队列 O(n) push $O(1) pop</h4><p>这个方法是在进的时候就构造好顺序，方便弹出</p><p>进的时候先将新元素放入空队列，再将已有队列中元素弹出，依次加入新元素所在队列</p><p>简单来说将队列前端和栈顶视为同一个方向，每次进的时候其实是在队列前端插入元素，也就是栈顶</p><h4 id="方法三-单队列"><a href="#方法三-单队列" class="headerlink" title="方法三 单队列"></a>方法三 单队列</h4><p>其实上面两种方法都可以用一个队列实现</p><p>核心就是将弹出元素放入新队列的操作改为放入当前队列。。其实就是两个队列拼在一起，现有队列在前，新队列在后</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><p>这里给出方法二的单队列的 C++ 实现</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MyStack</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="comment">/** Initialize your data structure here. */</span></span><br><span class="line"><span class="comment">// MyStack() &#123;&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/** Push element x onto stack. */</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">push</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">que.push(x);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> i = <span class="number">0</span>; i &lt; que.size() - <span class="number">1</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line">que.push(que.front());</span><br><span class="line">que.pop();</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/** Removes the element on top of the stack and returns that element. */</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">pop</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">auto</span> temp = que.front();</span><br><span class="line">que.pop();</span><br><span class="line"><span class="keyword">return</span> temp;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/** Get the top element. */</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">top</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">return</span> que.front();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/** Returns whether the stack is empty. */</span></span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">empty</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">return</span> que.empty();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="built_in">queue</span>&lt;<span class="keyword">int</span>&gt; que;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/Leetcode/">Leetcode</category>
      
      
      <comments>https://ry.huaji.store/2020/03/Leetcode-225/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>欢迎</title>
      <link>https://ry.huaji.store/2020/03/Welcome/</link>
      <guid>https://ry.huaji.store/2020/03/Welcome/</guid>
      <pubDate>Sun, 01 Mar 2020 09:54:47 GMT</pubDate>
      
        
        
      <description>&lt;p&gt;欢迎来到一只无存在感小透明的小站~~&lt;/p&gt;
&lt;p&gt;可以的话，不妨去&lt;a href=&quot;https://www.huaji.store/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;滑稽仓库&lt;/a&gt;看看？&lt;/p&gt;
</description>
        
      
      
      
      <content:encoded><![CDATA[<p>欢迎来到一只无存在感小透明的小站~~</p><p>可以的话，不妨去<a href="https://www.huaji.store/" target="_blank" rel="noopener">滑稽仓库</a>看看？</p>]]></content:encoded>
      
      
      
      <category domain="https://ry.huaji.store/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      
      
      <comments>https://ry.huaji.store/2020/03/Welcome/#disqus_thread</comments>
      
    </item>
    
    <follow_challenge>
      <feedId>90422073060264960</feedId>
      <userId>69722014333191168</userId>
    </follow_challenge>
  </channel>
</rss>
