P4760. 跳转指令的开销
场次:2026年4月11日-开发岗 · 来源:CodeFun2000 P4760
题目描述
有一个特殊的程序,包含 n 条指令,编号为 1 到 n。程序在执行时会按照一个固定的跳转规则移动:执行完指令 i 后,一定会跳转到指令 ,其中 。
每次执行指令 i 时,如果这是该指令在程序运行过程中第 t 次被执行,那么这一次就会产生 的计算开销。注意这里的 t 是对每一条指令独立计数的,即只统计该指令自身被执行的次数。
现在有 q 次询问。每次询问给定一个起始指令 p 和一个整数 k,表示程序从指令 p 开始执行,并且一共执行 k 条指令(包含起始的那一次)。对于每个询问,你需要输出程序在这 k 条指令的执行过程中产生的总开销,结果对 取模。
数据范围:指令数量 n 与询问数量 q 均不超过 2×10^5;跳转目标 均为 1 到 n 之间的整数;对于每个询问,起始指令 p 满足 ,执行次数 k 满足 。
输入格式
第一行输入两个整数 n 和 q,分别表示指令条数和询问个数。
第二行输入 n 个整数 ,其中 表示执行指令 i 后跳转到的指令编号。
此后 q 行,每行输入两个整数 p 和 k,表示从指令 p 开始执行、一共执行 k 次(含起始那次)的一组询问。
输出格式
对于每个询问,输出一行一个整数,表示这 k 次执行产生的总开销对 取模后的结果。
示例
示例 1
输入:
1 2
1
1 1
1 5
输出:
1
15
说明:
只有一条指令 ,每次执行产生的开销为 。
对于查询 1 1,,总开销为第 次执行 的开销 。
对于查询 1 5,,连续执行第 至第 次,总开销为 。
示例 2
输入:
2 3
2 1
1 1
1 4
2 3
输出:
1
9
7
说明:
指令 和 构成长度为 的环,跳转规则为 ,。
- 查询
1 1:仅执行指令 一次,开销 。 - 查询
1 4:执行序列 。指令 执行了第 次,产生开销 ;指令 执行了第 次,产生开销 ;总和为 。 - 查询
2 3:执行序列 。指令 执行了第 次,开销 ;指令 执行了第 次,开销 ;总和为 。
示例 3
输入:
5 4
2 3 4 2 4
1 2
1 8
5 4
5 10
输出:
3
34
14
59
说明:
图结构:环为 ,长度 。指令 指向 (距环 步),指令 指向 (距环 步)。
- 查询
1 2:执行 ,开销 。 - 查询
1 8:先执行树边部分 (开销 ),再在环上执行 次(完整两轮余 次)。序列 ,各指令计数与开销: 一次 ; 三次 ; 两次 ; 两次 ;合计 。 - 查询
5 4:执行 ,各执行一次,开销 。 - 查询
5 10:先执行一次 (开销 ),环上执行 次(完整三轮)。 各执行三次,开销分别为 ,,,总和 。