luogu#P9639. 「yyOI R1」youyou 的序列
「yyOI R1」youyou 的序列
题目描述
给定一个长度为 的序列 ,以及 次操作。
定义一次操作为:交换 与 的值,并立即询问所有以 为峰的子序列数量之和,对 取模。这里的交换是暂时的,也就是说,它仅在下一次操作前有效。
在此我们认为,一个长度至少为 的序列 $[a_1,a_2 ,\cdots,a_{s-1},a_s,a_{s+1},\cdots,a_{n-1},a_n ]$,满足 $a_1<a_2<\cdots<a_{s-1}
你的任务是回答出所有操作的答案。
输入格式
第一行输入两个整数 。
第二行输入 个正整数,表示一开始的序列 。
第三行,输入一个整数 ,表示进行第一次操作(定义见上),保证 。
第 到第 次操作的 值由如下方法得到:
int Answer(unsigned int ans)
{
unsigned int BASE=998244353ll*ans+ans*ans+ans/9991+ans%2159;
BASE^=9810;
BASE^=51971;
BASE=BASE>>7;
BASE=BASE<<11;
BASE^=751669;
BASE^=23465695622566ll;
return BASE%(n-1)+1;
}
当你每完成一次询问后,将你这次询问的答案 作为参数,恰好调用一次 Answer(ans)
。
得到的返回值即为下一次操作的 。
注意:本输入方式仅用于减少输入量,标准算法不依赖于此输入方式。
输出格式
你需要输出所有操作的答案,每个答案输出一行。
4 3
1 5 7 3
1
12
13
13
5 5
7 7 7 7 6
1
9
9
9
9
9
提示
样例解释 #1
第一次操作的 为 。
此时序列为 。
峰为 :,,。
峰为 :。
峰为 :,,,,,。
峰为 :,。
共计 个不同的子序列,答案输出 。
第二次和第三次操作的 均为 ,此时有 个不同的序列满足条件。
样例解释 #2
第一次操作的 为 。
此时序列为 。
峰为 :,。
峰为 :,。
峰为 :,。
峰为 :,。
峰为 :。
共计 个不同的子序列,答案输出 。
后四次操作同理。
数据范围
本题采用捆绑测试。
子任务编号 | 分数 | ||
---|---|---|---|
对于 的数据,,,。