题目出处

qbxt夏北京二期,提高组精英版,WYF出题。

题目

给定一个1~n的排列a,再给出m组询问。每次询问,你需要计算a[a[a[a…[x]]…],总共有t组括号。
n,m<=100000,t<=10^9。
输入第一行给出n,m,t,下一行n个数是排列a,接下来一行有m个数,分别表示每次询问。
输出m个数,每个排列的值。

思路

对于a[x],设b[x] = a[a[x]],c[x] = b[b[cx]]。
考虑快速幂,对于a,设b=a*a,c=b*b。
则有a = a^1, b = a^2, c = a^4,同理 a[x] = 1个a[x],b[x] = 2个a[x],c[x] = 4个a[x]。
那么对于a^t,可以由a^i(i=1,2,4…)的乘积的形式表示。同理,对于a[a[x…]]有t个括号,可以由i个a[x](i=1,2,4…)连接起来表示。
那么本题就先用O(n)的时间预处理出G[i][j](表示2^i个a[j]的值),然后每次询问时就可以直接用O(logt)的时间算出来了。
所以本题总的复杂度是 O(logt∗m) O ( l o g t ∗ m ) O(logt*m)。

代码

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define _for(i,a,b) for(int i = a; i<b; i++)
#define _rep(i,a,b) for(int i = a; i<=b; i++)const int maxn = 300000+10;
const int maxt = 30+5;
int n,m,t,A[maxn],G[maxt][maxn];int main(){scanf("%d%d%d",&n,&m,&t);_rep(i,1,n) scanf("%d",&A[i]);_rep(i,0,maxt-1)_rep(j,1,maxn-1){if (i == 0) G[i][j] = A[j];else G[i][j] = G[i-1][G[i-1][j]];}int num;while(m--){scanf("%d",&num);int k = log(t)/log(2) + 1;  // t变为二进制后的位数_for(i,0,k){if (t & (1<<i))num = G[i][num];}printf("%d\n",num);}return 0;
}

[二分] WYF快速幂魔改版相关推荐

  1. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)

    题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...

  2. 8.13模拟:分治二分倍增快速幂

    文章目录 前言 考场 复盘 T1 road T2 shop T3 run T4 stairs 总结 前言 240分 100+80+20+40 T3少取了一个模结果全挂掉了(好不容易推出来了-) T2也 ...

  3. LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)

    1. 题目 给你一个整数数组 nums 和一个整数 target . 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目. 由于答案可能很大 ...

  4. 快速幂、快速乘、矩阵快速幂

    文章目录 一 快速幂 模板 模板例题 二 快速乘 模板 三 矩阵快速幂 例题 模板题 应用题1 应用题2 一 快速幂 目的:当我们在求f(x) = a ^ x % mod时,f(x)的结果会呈指数型增 ...

  5. hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)

    M斐波那契数列                                                                           Time Limit: 3000/1 ...

  6. 六十八、快速幂算法、牛顿迭代法、累加数组+二分查找的变形

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 上次介绍了二分查找算法及其四个变形问题,下面介绍二分法常用的场景和典 ...

  7. 二分(三分)+快速幂

    之前学习的二分,现在感觉突然理解许多,补一下总结 首先,二分能够解决什么样的问题呢,个人认为,二分能够快速解决已经知道答案范围(线性)但是不知道确切答案的问题,例如在一个有序序列中查找某一元素出现的( ...

  8. 快速幂实现pow函数(从二分和二进制两种角度理解快速幂)

    文章目录 迭代实现快速幂 思路 int的取值范围 快速幂 从二进制的角度来理解 从二分法的角度来理解 代码 复杂度分析 进阶--超级次方 思路 倒序+快速幂 正序+快速幂 代码 复杂度分析 迭代实现快 ...

  9. 二分幂,快速幂,矩阵快速幂,快速乘

    前言 二分幂,快速幂,矩阵快速幂在算大指数次方时是很高效的. 求 a^n 的值是多少?n是1到10^18次方的一个整数. 求一个数的n次方,朴素的算法就是直接for循环,一遍一遍的乘,a*a*a*a* ...

最新文章

  1. linux下elasticsearch 安装、配置
  2. [转]RDLC报表-参数传递及主从报表
  3. python3中多项式创建_机器学习入门之机器学习之路:python 多项式特征生成PolynomialFeatures 欠拟合与过拟合...
  4. vue动态生成表单元素基础篇
  5. 模拟集成电路的经典教材
  6. 使用python pandas dataframe学习数据分析
  7. 工作173:一级控制二级菜单的变化
  8. 《C语言从入门到精通》pdf
  9. 超详细!一文详解 SparkStreaming 如何整合 Kafka !附代码可实践
  10. FTP+SSL(加密的ftp)
  11. 博客园自定义样式(标题 h1 h2 h3)
  12. git 远程仓库 remote 使用总结
  13. 下载mysql驱动jar包教程
  14. OCR-CTPN 文字检测
  15. 苹果手表GPS和蜂窝有什么区别
  16. 从微软官网下载win10镜像.iso文件
  17. mysql 行转列查询优化_行转列及列转行查询
  18. 用单片机C语言开发雨滴智能屏小程序
  19. 【概念理解】typedef-Lnode-*Linklist
  20. 如何解决vsCode上编写代码,手机上不能实时更新查看效果的问题?

热门文章

  1. Java深克隆实现方法
  2. 【Shell】20天学会shell脚本命令(2)变量的详解
  3. win11 改文件后缀 设置后缀名可修改
  4. CII-关键信息基础设施风险评估必要性
  5. 什么是WordPress Gutenberg?
  6. 大电流滑环的结构特征
  7. 需要打开密码才能解压的压缩包如何解决
  8. 车牌识别系统服务器设计,道闸车牌识别系统停车场管理设计方案
  9. 服务器卡在系统初始化,Dell PERC卡RAID配置信息的初始化
  10. 为什么程序员跳槽加薪会比内部调薪要高?