1 条题解
-
0
题解
设序列为 ,满足 且相邻差值 ()都不超过 。对任意一组差值序列 ,如果把它们的和记为 ,则 。由于 ,总能选出合法的 ,且 可以取 的任意整数。因此对于固定的差值组合,合法序列的数量恰为 。
所有差值相互独立,且每个 有 种取值,所以共有 组差值序列。于是答案为
而 可以拆分:每个位置的差值在所有组合中出现 次,差值取值之和为 ,一共有 个位置,因而
$$\sum S = (K-1) \cdot M^{K-2} \cdot \frac{M(M+1)}{2}. $$把上述公式整理后再对模数 取模即可。代码中使用快速幂求出 ,再套用推导出的闭式公式。
#include <iostream> int main() { long long N, M, K, P; std::cin >> N >> K >> M >> P; long long s = 1, x = K - 2, n = M; for (; x; x /= 2, n = n * n % P) if (x & 1) s = s * n % P; std::cout << s * (N % P * M % P - (M + 1) * M / 2 % P * (K - 1) % P + P) % P << '\n'; return 0; }
- 1
信息
- ID
- 3257
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者