Teitoku 的能力是「未元物质」。
Teitoku 能产生这个世界上真正不存在的物质。
在被 Accelerator 打败变成冰箱后,Teitoku 获得了利用「未元物质」重新建构人体细胞的技术,通过量产「未元物质」产生自己新的身体。
Teitoku 发现:每一片个体 i 都有自己的力量 bi,将它们组合后,总力量为 ∏bi。
然而,Teitoku 的改造尚未完成,假如组合后的总力量大于他的限度 L,即使是「未元物质」的主体也无法维持 Teitoku 这个安定的人格。
Teitoku 想在得到安定人格的基础上获得最大的力量,还想知道有多少种不同的可能性能达到这一目标。
这对于 Level 5 的 Teitoku 来说自然不是问题,但你能做到吗?
形式化描述如下:
给定一个长度为 n 的序列 a,求出有多少不同的 a 的子序列 b 使得 i=1∏∣b∣bi≤L 且 i=1∏∣b∣bi 最大,其中 ∣b∣ 为 b 的长度。特别地,若 b 为空,定义 i=1∏∣b∣bi=1。
i=1∏∣b∣bi 即 b1×b2×⋯×b∣b∣。
一个序列 a 的子序列 b 定义为:在 a 中删除一些数(也可全删或者不删)得到的新的序列。
若两个序列删去的数的下标不同,则称这两个序列不相同。
为了节省输入带来的时间消耗,使用以下随机数生成器生成数列 a。 随机种子 xorshift128p_state 将通过输入提供。为了限制数字的范围,random_number_generator 产生 [0,p) 内的随机整数。
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
struct xorshift128p_state {
ull a, b;
};
struct xorshift128p_state state;
/* The state must be seeded so that it is not all zero */
ull xorshift128p()
{
ull t = state.a;
ull const s = state.b;
state.a = s;
t ^= t << 23; // a
t ^= t >> 17; // b
t ^= s ^ (s >> 26); // c
state.b = t;
return t + s;
}
ull random_number_generator(ull p)
{
return xorshift128p() % p;
}
在读入 n,p,L,随机种子 state 之后,你可以直接使用如下代码产生数列 a。
ull a[114514], p;
int n;
void data_generator()
{
for (int i = 1; i <= n; ++i)
a[i] = random_number_generator(p);
}