P3228 题解

P3228 [HNOI2013] 数列

题目大意

给定四个参数 $N$,$K$,$M$,$P$,你需要构造一个长度为 $K$ 的上升序列,令这个构造序列为 $A$,这个上升序列需要满足以下条件:

  1. $\forall A_i,i \in \left\{1 \le i \le k \mid i \in \Z\right\},A_i \le N$。
  2. $\forall A_i, i \in \left\{1 < i \le k \mid i \in \Z\right\}, A_{i-1} \le A_i$。
  3. $\forall A_i,i \in \left\{1 \le i \le k \mid i \in \Z\right\},A_i - A_{i-1} \le M$。

试求解出构造合法的上升序列 $A$ 的的方案数对 $P$ 取模的结果,其中对于给定的四个参数满足以下条件:

  1. $M(K - 1) < N$。
  2. $M, K, P \le 10^9, N \le 10^{18}$。

思路

显然对于每一个合法的上升序列 $A$,这个上升序列对于总方案数的贡献为 $1$,可以考虑维护一个表示序列具体数据的差分序列,这样的话就可以不用考虑 $A_1$ 的取值。

令这个差分序列为 $B$,则 $B$ 的贡献为:$$ n - \sum_{i = 1}^{k - 1}{B_i} $$ 一共会有 $m_{k - 1}$ 个不同的差分序列,总的贡献为:$$ \sum_{i = 1}^{m^{k - 1}}(n - \sum_{j = 1}^{k - 1}{B_{i,j}}) $$ 经过简单变换可得:$$ n \times m^{k - 1} - \sum_{i = 1}^{m^{k - 1}}\sum_{j = 1}^{k - 1}{B_{i,j}} $$ 注意到差分序列 $B_{i,j} \in [1, m]$,显然一共会有 $m^{k - 2} \times (k - 1)$ 个数在 $[1, m]$ 中完全平均分布,则 $[1, m]$ 中的每一个数都会出现 $\frac{m^{k - 1} \times (k - 1)}{m}$ 次。

可以求出总和为:$$ \frac{m^{k - 1} \times (k - 1)}{m} \times \frac{(m + 1)m}{2} $$ 代入原式得:$$ n * m^{k - 1} - \frac{m^{k - 1} \times (k - 1)}{m} \times \frac{(m + 1)m}{2} $$ 经过简单变换可得最终总方案数为:$$ n \times m^{k - 1} - m^{k - 2} \times (k - 1) \times \frac{(m + 1)m}{2} $$

至于代码实现的话,直接用快速幂和逆元求解这个式子的值就可以了。

具体细节请看代码……

代码

#include <iostream>
using namespace std;
#define int long long
int n, k, m, p, x, y, gcd, ans;
int qpow(int a, int b){
    int ans = 1;
    while(b > 0){
        if(b & 1){ans *= a;ans %= p;}
        b >>= 1;a *= a;a %= p;
    }
    return ans;
}
int exgcd(int a, int b, int &x, int &y) // 扩欧求逆元
{
    if(b == 0){x = 1;y = 0;return a;}
    int d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}
signed main(){
    cin >> n >> k >> m >> p;
    gcd = exgcd(2, p, x, y); // 求逆元
    x = (x % p + p) % p;
    ans += (qpow(m, k - 1) * (n % p)) % p;
    ans -= ((((qpow(m, k - 1) * (k - 1)) % p * (m + 1)) % p) % p * x % p);
    ans = (ans % p + p) % p; // 依据表达式求解答案
    cout << ans << endl;
    return 0;
} // 完结撒花~~
posted @ 2023-08-24 15:59  tsqtsqtsq  阅读(11)  评论(0)    收藏  举报  来源