[二分] WYF快速幂魔改版
题目出处
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快速幂魔改版相关推荐
- BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)
题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...
- 8.13模拟:分治二分倍增快速幂
文章目录 前言 考场 复盘 T1 road T2 shop T3 run T4 stairs 总结 前言 240分 100+80+20+40 T3少取了一个模结果全挂掉了(好不容易推出来了-) T2也 ...
- LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)
1. 题目 给你一个整数数组 nums 和一个整数 target . 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目. 由于答案可能很大 ...
- 快速幂、快速乘、矩阵快速幂
文章目录 一 快速幂 模板 模板例题 二 快速乘 模板 三 矩阵快速幂 例题 模板题 应用题1 应用题2 一 快速幂 目的:当我们在求f(x) = a ^ x % mod时,f(x)的结果会呈指数型增 ...
- hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)
M斐波那契数列 Time Limit: 3000/1 ...
- 六十八、快速幂算法、牛顿迭代法、累加数组+二分查找的变形
@Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 上次介绍了二分查找算法及其四个变形问题,下面介绍二分法常用的场景和典 ...
- 二分(三分)+快速幂
之前学习的二分,现在感觉突然理解许多,补一下总结 首先,二分能够解决什么样的问题呢,个人认为,二分能够快速解决已经知道答案范围(线性)但是不知道确切答案的问题,例如在一个有序序列中查找某一元素出现的( ...
- 快速幂实现pow函数(从二分和二进制两种角度理解快速幂)
文章目录 迭代实现快速幂 思路 int的取值范围 快速幂 从二进制的角度来理解 从二分法的角度来理解 代码 复杂度分析 进阶--超级次方 思路 倒序+快速幂 正序+快速幂 代码 复杂度分析 迭代实现快 ...
- 二分幂,快速幂,矩阵快速幂,快速乘
前言 二分幂,快速幂,矩阵快速幂在算大指数次方时是很高效的. 求 a^n 的值是多少?n是1到10^18次方的一个整数. 求一个数的n次方,朴素的算法就是直接for循环,一遍一遍的乘,a*a*a*a* ...
最新文章
- linux下elasticsearch 安装、配置
- [转]RDLC报表-参数传递及主从报表
- python3中多项式创建_机器学习入门之机器学习之路:python 多项式特征生成PolynomialFeatures 欠拟合与过拟合...
- vue动态生成表单元素基础篇
- 模拟集成电路的经典教材
- 使用python pandas dataframe学习数据分析
- 工作173:一级控制二级菜单的变化
- 《C语言从入门到精通》pdf
- 超详细!一文详解 SparkStreaming 如何整合 Kafka !附代码可实践
- FTP+SSL(加密的ftp)
- 博客园自定义样式(标题 h1 h2 h3)
- git 远程仓库 remote 使用总结
- 下载mysql驱动jar包教程
- OCR-CTPN 文字检测
- 苹果手表GPS和蜂窝有什么区别
- 从微软官网下载win10镜像.iso文件
- mysql 行转列查询优化_行转列及列转行查询
- 用单片机C语言开发雨滴智能屏小程序
- 【概念理解】typedef-Lnode-*Linklist
- 如何解决vsCode上编写代码,手机上不能实时更新查看效果的问题?