首页 > 其他分享 >题解 P6620【[省选联考 2020 A 卷] 组合数问题】

题解 P6620【[省选联考 2020 A 卷] 组合数问题】

时间:2024-08-11 21:27:52浏览次数:15  
标签:const 省选 题解 rhs return Bmatrix sum modint 联考

直接摘抄 OI-wiki 了。

第二类斯特林数

第二类斯特林数(斯特林子集数)\(\begin{Bmatrix}n\\ k\end{Bmatrix}\),也可记做 \(S(n,k)\),表示将 \(n\) 个两两不同的元素,划分为 \(k\) 个互不区分的非空子集的方案数。

递推式

\[\begin{Bmatrix}n\\ k\end{Bmatrix}=\begin{Bmatrix}n-1\\ k-1\end{Bmatrix}+k\begin{Bmatrix}n-1\\ k\end{Bmatrix} \]

边界是 \(\begin{Bmatrix}n\\ 0\end{Bmatrix}=[n=0]\)。

考虑用组合意义来证明。

我们插入一个新元素时,有两种方案:

  • 将新元素单独放入一个子集,有 \(\begin{Bmatrix}n-1\\ k-1\end{Bmatrix}\) 种方案;
  • 将新元素放入一个现有的非空子集,有 \(k\begin{Bmatrix}n-1\\ k\end{Bmatrix}\) 种方案。

根据加法原理,将两式相加即可得到递推式。

普通幂转下降幂

我们记下降阶乘幂 \(x^{\underline{n}}=\dfrac{x!}{(x-n)!}=\prod_{k=0}^{n-1} (x-k)\)。

则可以利用下面的恒等式将普通幂转化为下降幂:

\[x^n=\sum_{k} \begin{Bmatrix}n\\ k\end{Bmatrix} x^{\underline{k}} \]

含义是:有 \(n\) 个有标号小球,想要放进 \(x\) 个有标号盒子中,问有多少种方案。第一种算法是 \(x^n\)。第二种算法则考虑最终有 \(k\) 个盒子是非空的,小球划分为 \(k\) 个无标号集合,从盒子中有标号地选 \(k\) 个盒子出来。

吸收恒等式

\[m^{\underline k}\binom n m=n^{\underline k}\binom {n-k}{m-k} \]

有 \(n\) 个有标号小球,先无序地选出 \(m\) 个,再从 \(m\) 个中有序地选出 \(k\) 个,等价于选从 \(n\) 个中有序地选出 \(k\) 个,再从剩下的小球中无序地选出 \(m-k\) 个。

题目描述

众所周知,小葱同学擅长计算,尤其擅长计算组合数。小葱现在希望你计算

\[\left(\sum_{k=0}^{n}f(k)\times x^k\times \binom{n}{k}\right)\bmod p \]

的值。其中 \(n\), \(x\), \(p\) 为给定的整数,\(f(k)\) 为给定的一个 \(m\) 次多项式 \(f(k) = a_0 + a_1k + a_2k^2 + \cdots + a_mk^m\)。\(\binom{n}{k}\) 为组合数,其值为 \(\binom{n}{k} = \frac{n!}{k!(n-k)!}\)。

对于所有测试数据:\(1\le n, x, p \le 10^9, 0\le a_i\le 10^9, 0\le m \le \min(n,1000)\)。

solution

\(f(k)\) 转为下降幂形式 \(\sum_{i=0}^m b_ik^{\underline i}\)。则有

\[\begin{aligned} &=\sum_{k=0}^n\sum_{i=0}^mb_ik^{\underline i}x^k\binom n k\\ &=\sum_{k=0}^n\sum_{i=0}^mb_in^{\underline i}x^k\binom {n-i} {k-i}\\ &=\sum_{i=0}^mb_in^{\underline i}\sum_{k=0}^nx^k\binom {n-i} {k-i}\\ &=\sum_{i=0}^mb_in^{\underline i}x^i\sum_{k=0}^{n-i}x^k\binom {n-i} {k}\\ &=\sum_{i=0}^mb_in^{\underline i}x^i(1+x)^{n-i} \end{aligned} \]

足以计算。依实现,可以 \(O(m^2\log n)\) 或 \(O(m^2)\)。

code

#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr, ##__VA_ARGS__)
#else
#define endl "\n"
#define debug(...) void(0)
#endif
using LL = long long;
template <class T>
using must_int = enable_if_t<is_integral<T>::value, int>;
template <int id>
struct modint {/*{{{*/
  static int mod;
  static unsigned umod;
  static void setmod(int p) { mod = umod = p; }
  unsigned v;
  modint() : v(0) {}
  template <class T, must_int<T> = 0>
  modint(T x) {
    x %= mod;
    v = x < 0 ? x + mod : x;
  }
  modint operator+() const { return *this; }
  modint operator-() const { return modint() - *this; }
  friend int raw(const modint &self) { return self.v; }
  friend ostream& operator<<(ostream& os, const modint &self) { 
    return os << raw(self); 
  }
  modint &operator+=(const modint &rhs) {
    v += rhs.v;
    if (v >= umod) v -= umod;
    return *this;
  }
  modint &operator-=(const modint &rhs) {
    v -= rhs.v;
    if (v >= umod) v += umod;
    return *this;
  }
  modint &operator*=(const modint &rhs) {
    v = 1ull * v * rhs.v % umod;
    return *this;
  }
  modint &operator/=(const modint &rhs) {
    assert(rhs.v);
    return *this *= qpow(rhs, mod - 2);
  }
  template <class T, must_int<T> = 0>
  friend modint qpow(modint a, T b) {
    modint r = 1;
    for (; b; b >>= 1, a *= a)
      if (b & 1) r *= a;
    return r;
  }
  friend modint operator+(modint lhs, const modint &rhs) { return lhs += rhs; }
  friend modint operator-(modint lhs, const modint &rhs) { return lhs -= rhs; }
  friend modint operator*(modint lhs, const modint &rhs) { return lhs *= rhs; }
  friend modint operator/(modint lhs, const modint &rhs) { return lhs /= rhs; }
  bool operator==(const modint &rhs) const { return v == rhs.v; }
  bool operator!=(const modint &rhs) const { return v != rhs.v; }
};/*}}}*/
template <int id>
unsigned modint<id>::umod;
template <int id>
int modint<id>::mod;
using mint = modint<-1>;
int n, m;
mint X, b[1010], S[1010][1010];
int main() {
#ifndef LOCAL
  cin.tie(nullptr)->sync_with_stdio(false);  
#endif
  cin >> n >> X.v >> mint::mod >> m;
  mint::setmod(mint::mod);
  X.v %= mint::mod;
  S[0][0] = 1;
  for (int i = 1; i <= m; i++) {
    S[i][0] = 0;
    for (int j = 1; j <= i; j++) S[i][j] = S[i - 1][j - 1] + S[i - 1][j] * j;
  }
  for (int i = 0; i <= m; i++) {
    int x;
    cin >> x;
    for (int j = 0; j <= i; j++) b[j] += S[i][j] * x;
  }
  mint ans = 0;
  mint now = 1;
  for (int i = 0; i <= m; i++) {
    ans += b[i] * now * qpow(X, i) * qpow(1 + X, n - i);
    now *= n - i;
  }
  cout << ans << endl;
  return 0;
}

标签:const,省选,题解,rhs,return,Bmatrix,sum,modint,联考
From: https://www.cnblogs.com/caijianhong/p/18353926/solution-P6620

相关文章

  • l洛谷 P7870 兔已着陆——题解
    洛谷P7870题解传送锚点摸鱼环节「Wdoi-4」兔已着陆题目背景铃瑚和清兰是从月之都到达幻想乡的两只月兔。正因为降落到了幻想乡进行调查,因此她们通过开团子屋制作团子出售的方式,在幻想乡生活。为了应对越发繁荣的市场,她们向河城荷取购置了一台团子机器,可以高效地生产出五颜......
  • CF1264E Beautiful League 题解
    CF1264E你有一张竞赛图,给你竞赛图中\(m\)条边的方向,让你对于没有给定的边确定方向使得整张图的三元环个数最多\(n\leq50,m\leq\frac{(n-1)n}{2}\)费用流好题三元环是一个非常难考虑的东西,我们考虑求他的补集:不是三元环的个数最少我们发现不是三元环的情况是存......
  • CF1586E. Moment of Bloom 题解
    CF1586E胡桃是一个小恶作剧高手,她用这个图问题试图吓唬你!你有一个包含\(n\)个节点和\(m\)条边的连通无向图。你还需要处理\(q\)个查询。每个查询由两个节点\(a\)和\(b\)组成。最初,图中的所有边的权重都是\(0\)。对于每个查询,你必须选择一条从\(a\)开始并以\(b\)......
  • CF1515F Phoenix and Earthquake 题解
    CF1515F给定一张\(n\)个点\(m\)条边的无向连通图和正整数\(x\),点有非负权值\(a_i\)。如果一条边\((u,v)\)满足\(a_u+a_v\gex\),可以将\(u,v\)缩起来,新点的点权为\(a_u+a_v-x\)。判断这张图是否可以缩成一个点。如果是,还要输出每次缩的是哪条边。\(2\len\le3......
  • CF1654E Arithmetic Operations 题解
    CF1654E给定一个长度为\(n\)的序列\(a\)。问至少需要修改几个数才能使得\(a\)变为一个等差数列。\(n\leq10^5\),\(1\leqa_i\leq10^5\)。我们可以发现值域\(\leq10^5\)实属可疑,我们可以就这点进行分析考虑对于序列的公差\(d\),如果\(d\)太大的话经过若干......
  • CF1508C Complete the MST 题解
    CF1508C给定一个有\(n\)个节点的完全图,其中\(m\)条边有给定的边权,剩下的没有给定。你需要给所有没有给定边权的边赋上非负整数边权,使得所有边的边权的异或和等于\(0\)。我们认为这个图的“丑陋值”为这个图的最小生成树的边权之和,求所有可能的赋值方案中,“丑陋值”的最小......
  • ABC366 题解
    D-CuboidSumQuery三维前缀和。不过有一维范围小,可以暴力然后二位前缀和。E-ManhattanMultifocalEllipse横纵坐标的距离是独立的。扫描线扫横坐标,维护每个可行点的纵坐标的距离和,查询就是\(\lex\)的数的个数。可以通过桶做到线性。F-MaximumCompositionExchan......
  • HDU 不要62 题解
    题目传送门思路数位dp数位dp数位dp模版题。依次考虑每一位,满足题目给出的限制,统计数量,是一些较简单的数位dp题目的过程。数位dp运用了差分的思想,即求\(ans(l-r)\)的答案用\(ans(1-r)-ans(1-(l-1))\)来表示.对于本题,我们需要满足的性质很简单:使数不超......
  • P1502 窗口的星星 题解
    题目传送门。思路扫描线扫描线首先,将题目中给出的条件和问题进行转化:首先先不考虑边框上的点不算在内的限制,考虑一个点可以对那些矩形产生贡献。只考虑矩形的右上角,容易发现,每个星星的亮度只对右上角在以星星为左下角的长为\(W\),高为\(H\)的矩形有贡献。如图。那么便可......
  • 洛谷 4道水题 题解(字符串入门)
    题目目录:No.1 B2109统计数字字符个数 No.2 B2110找第一个只出现一次的字符 No.3 B2111基因相关性No.4 B2113输出亲朋字符串OK开始正文!第一题:B2109统计数字字符个数题目描述输入一行字符,统计出其中数字字符的个数。输入格式一行字符串,总长度不超过 255。......