现在蒜头有 $N$ 个盒子,第 $i$ 个盒子里面有 $p_i$ 个球,蒜头从一个盒子中只能拿一个球出来,他想要知道恰好拿出来 $M$ 个球的方案数,对 $998244353$ 取模。但是他自己却不知道怎么做,所以他现在来求助于你。
但是蒜头不想让其他人知道它具体有多少球,所以他不会告诉你 $p_i$ 的具体的值,而需要你来指导他怎样计算。具体来说,蒜头有一个长度为 $T$ 的整型数组 $A$,其中前 $N$ 个位置初始存的是 $p_1,p_2,\cdots,p_N$ ,其余位置的初始值由你来决定。在决定完初始值之后,你就只能指导他进行计算了,即只能提出 $A_i=A_j+A_k$,$A_i=A_j-A_k$,$A_i=A_j*A_k$ (所有运算均在模 $p$ 意义下)这三种计算。并且在指导过程中蒜头不允许你修改前 $N$ 个位置的值。在完成指导后,你还需要指出 $A$ 中的哪一个数是答案。
任务
你需要编写两个函数,以完成题目的任务:
- Init(N,M,T);
- $N,M,T$ 的含义如题面所述。
- 在这个函数中你需要给出数组 $A$ 中其余位置的初始值,如果不给定则会是随机数值。
- solve();
- 在这个函数中你需要制定蒜头进行计算,并指出哪一个数是答案。
在Init(N,M,T)中,你可以也只能调用交互库的如下函数:
- Set(i,x);
- 表示将 $A_i$ 的初始值设为 $x$ ,可以对于同一 $i$ 重复调用,但需要满足 $N < i \leq T$。
在solve()中,你可以也只能调用交互库的如下函数:
- Plus(i,j,k);
- 表示指导大蒜进行一次 $A_i=A_j+A_k$ 的计算,需要满足 $N < i \leq T, 1 \leq j,k \leq T$。
- Minus(i,j,k);
- 表示指导大蒜进行一次 $A_i=A_j-A_k$ 的计算,需要满足 $N < i \leq T, 1 \leq j,k \leq T$。
- Multiply(i,j,k);
- 表示指导大蒜进行一次 $A_i=A_j*A_k$ 的计算,需要满足 $N < i \leq T, 1 \leq j,k \leq T$。
- Answer(i);
- 表示告诉打算答案存在 $A_i$ 中,需要满足 $1 \leq i \leq T$。
- 注意在执行完这一函数后程序将直接结束。
实现细节
本题只支持 C++。
你只能提交一个源文件实现上述的 Init 和 Solve 函数,并且遵循下面的命名和接口。你需要包含头文件 polynomail.h。
void Init(int N,int M,int T);
void Solve();
函数 Set, Plus, Minus, Multiply, Answer 的接口信息如下。
void Set(int i,int x);
void Plus(int i,int j,int k);
void Minus(int i,int j,int k);
void Multiply(int i,int j,int k);
void Answer(int i);
评测方式
评测系统将读入如下格式的输入数据:
第一行三个整数 $N,M,T$。
第二行 $N$ 个整数 $p_i$。
评测系统将输出如下格式的输出数据:
第一行一个整数 $ans$,表示你所指出的位置上的值。
限制与约定
Subtask1(5分):$1 \leq N \leq 1000, 0 \leq M \leq N, T=10000$;
Subtask2(15分):$1 \leq N \leq 1000, 0 \leq M \leq N, T=2048$;
Subtask3(20分):$1 \leq N \leq 1000, 0 \leq M \leq N, T=1100$;
Subtask4(10分):$1 \leq N \leq 1000, 0 \leq M \leq N, T=1050$;
Subtask5(10分):$1 \leq N \leq 1000, 0 \leq M \leq N, T=1020$;
Subtask6(10分):$1 \leq N \leq 1000, 0 \leq M \leq N, T=1012$;
Subtask7(10分):$1 \leq N \leq 1000, 0 \leq M \leq N, T=1008$;
Subtask8(10分):$1 \leq N \leq 1000, 0 \leq M \leq N, T=1006$;
Subtask9(10分):$1 \leq N \leq 1000, 0 \leq M \leq N, T=1005$;
时间限制:1s
空间限制:512MB