zoukankan      html  css  js  c++  java
  • 【六省联考2017】相逢是问候

    • 我还停留在 oyyp 去年 8 月的水平,我真的没救了,以后准备铁牌退役吧

    Description

      https://loj.ac/problem/2142

    Solution

      考察对扩展欧拉定理的理解。
      我们知道扩展欧拉定理长这样 $$a^b% p = a^{b% varphi(p) + (bge varphi(p) ? varphi(p) : 0)}$$
      那么进行一次题目中的修改操作,得到 (a^{a^b}),发现 $$egin{align} a^{a^b}% p &= a^{a^b% varphi(p)+(a^bge varphi(p) ? varphi(p) : 0)}% p onumber &= a^{a^{b% varphi(varphi(p)) + cdots}% varphi(p) + cdots}% p onumber end{align}$$(“(cdots)” 用于省略类似于 ((bge varphi(p) ? varphi(p) : 0)) 的语句)
      不难发现指数每往上一级,模数 (p') 就会求一次欧拉函数,即 (varphi(p'))
      有个性质:对于一个正整数 (p),不断地对其求欧拉函数,至多求 (2log p) 次就会变成 (1),之后一直都是 (1)。证明很简单自己去看
      故当一个数 (a) 被进行一定次题目中的修改操作后,再怎么修改值都不会变了,故我们可以忽略掉以后对它的操作。
      用线段树维护题目给定的数组,区间修改下传 tag 时,若这个区间中所有数的修改次数都够了,就不用下传 tag 了。tag 下传到叶子节点时,暴力重算该点的值即可(这里需要快速幂,故复杂度再多一个 (log)),每个数最多被暴力重算 (2log p) 次,故复杂度是对的。
      时间复杂度 (O(nlog nlog^2 p))

      这个复杂度有可能跑不过。不难发现由于快速幂的底数始终是个定值 (c),所以可以 (O(sqrt{p})) 预处理、(O(1)) 查询,即光速幂。具体做法:预处理出 (c^{0cdots 10000}),再预处理出 (d^{0cdots 10000})(d=c^{10000})),查询 (c^k) 时求 (d^{k/10000} imes c^{k\%10000}),注意单独处理 (k=10^8) 的情况。
      时间复杂度 (O(nlog nlog p))

  • 相关阅读:
    宝塔跨域
    朵纳接口
    thinkphp5笔记
    phpstudy 配置域名访问无效
    如何在CentOS 下开放8080端口
    PHP:cURL error 60: SSL certificate unable to get local issuer certificate
    thinkphp6 项目使用composer安装好后提示控制器不存在:appcontrollerIndex
    DB2和MySql的区别是什么?
    idea 编辑工具
    Sublime text3最全快捷键清单
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/loj2142.html
Copyright © 2011-2022 走看看