2 条题解
-
0
题解
思路分析
这是一道 组合数学 + 矩阵快速幂 的计数问题。
问题建模
- 天股价,第一天在 范围内
- 每天比前一天高,且高出不超过
- 求方案数模
核心思路
1. 差分数组
设第 天股价为 ,定义差分数组:
则有:
2. 容斥原理计数
固定 ,问题转化为:
其中 。
这等价于计数:有多少个长度为 的序列,每个元素在 内,和 。
使用组合数学:
$$\text{方案数} = \sum_{sum=K-1}^{\min(M(K-1), N-s_1)} C_{sum-1}^{K-2} $$3. 求和优化
对 求和:
通过推导,可以化简为:
$$\text{答案} = M^{K-2} \times (N \cdot M - \frac{M(M+1)}{2}(K-1)) $$4. 快速幂
使用快速幂计算( 可能很大)。
算法步骤
-
公式推导:
- 化简为组合数求和
- 得到闭式公式
-
快速幂计算:
- 计算
-
计算答案:
- 套用公式,注意取模
-
输出结果
复杂度分析
- 时间复杂度:
- 空间复杂度:
#import<iostream> long N,M,K,P,s=1,x,n;main(){std::cin>>N>>K>>M>>P;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;} -
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
- 上传者