首页 > 其他分享 >积的和典型

积的和典型

时间:2024-06-08 13:45:34浏览次数:7  
标签:典型 return operator const 2n mint mod

对于所有长度为 \(n\) 且总和为 \(m\) 的任意正整数序列 \(a\),求 \(\sum\prod a_i \bmod~ 998244353\) 。

限制:

  • \(1 \leqslant n, m \leqslant 2 \times 10^5\)

算法分析

做法一:积的和典型

一方面,满足 \(\sum a_i = m\) 的正整数序列个数,可以考虑在 \(m\) 个白球中插入 \(n-1\) 个隔板,那么就会得到 \(n\) 个区间

另一方面,\(\prod a_i\) 可以理解为在每个区间中任选一个球(不妨将这个球染成红色)的方案数,因为不同区间的选法是独立的,所以是乘法

然后将这二者综合起来考虑,不妨把隔板换成红球(不会影响上面的选法数),这样就得到 \(n+m-1\) 个球,且其中有 \(2n-1\) 个红球,那么总方案数就是 \(\binom{n+m-1}{2n-1}\)

(更喜欢这种做法,虽然理解起来会比较困难)

做法二:生成函数

写成生成函数的式子就是 \([x^m](x + 2x^2 + 3x^3 + \cdots)^n\)

记 \(f(x) = x + 2x^2 + 3x^3 + \cdots\)
\( \begin{aligned} (1-x)f(x) &= (x + 2x^2 + 3x^3 + \cdots) - (x^2 + 2x^3 + 3x^4 + \cdots)\\ &= x + x^2 + x^3 + \cdots\\ &= \frac{x}{1-x} \end{aligned} \)

\( \Rightarrow ~ f(x) = \frac{x}{(1-x)^2} \)

于是,\([x^m]f(x)^n = [x^m]\frac{x^n}{(1-x)^{2n}} = [x^{m-n}]\frac{1}{(1-x)^{2n}}\)

这个值可以用负数的二项式写成 \((-1)^{m-n}\binom{-2n}{m-n}\)

一般地,我们有 \(\binom{-n}{k} = (-1)^k\binom{n+k-1}{k}\)

所以,\((-1)^{m-n}\binom{-2n}{m-n} = \binom{m+n-1}{m-n} = \binom{m+n-1}{2n-1}\) 。

代码实现
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int mod = 998244353;
//const int mod = 1000000007;
struct mint {
    ll x;
    mint(ll x=0):x((x%mod+mod)%mod) {}
    mint operator-() const {
        return mint(-x);
    }
    mint& operator+=(const mint a) {
        if ((x += a.x) >= mod) x -= mod;
        return *this;
    }
    mint& operator-=(const mint a) {
        if ((x += mod-a.x) >= mod) x -= mod;
        return *this;
    }
    mint& operator*=(const mint a) {
        (x *= a.x) %= mod;
        return *this;
    }
    mint operator+(const mint a) const {
        return mint(*this) += a;
    }
    mint operator-(const mint a) const {
        return mint(*this) -= a;
    }
    mint operator*(const mint a) const {
        return mint(*this) *= a;
    }
    mint pow(ll t) const {
        if (!t) return 1;
        mint a = pow(t>>1);
        a *= a;
        if (t&1) a *= *this;
        return a;
    }

    // for prime mod
    mint inv() const {
        return pow(mod-2);
    }
    mint& operator/=(const mint a) {
        return *this *= a.inv();
    }
    mint operator/(const mint a) const {
        return mint(*this) /= a;
    }
};
istream& operator>>(istream& is, mint& a) {
    return is >> a.x;
}
ostream& operator<<(ostream& os, const mint& a) {
    return os << a.x;
}

struct modinv {
  int n; vector<mint> d;
  modinv(): n(2), d({0,1}) {}
  mint operator()(int i) {
    while (n <= i) d.push_back(-d[mod%n]*(mod/n)), ++n;
    return d[i];
  }
  mint operator[](int i) const { return d[i];}
} invs;
struct modfact {
  int n; vector<mint> d;
  modfact(): n(2), d({1,1}) {}
  mint operator()(int i) {
    while (n <= i) d.push_back(d.back()*n), ++n;
    return d[i];
  }
  mint operator[](int i) const { return d[i];}
} facts;
struct modfactinv {
  int n; vector<mint> d;
  modfactinv(): n(2), d({1,1}) {}
  mint operator()(int i) {
    while (n <= i) d.push_back(d.back()*invs(n)), ++n;
    return d[i];
  }
  mint operator[](int i) const { return d[i];}
} ifacts;
mint comb(int n, int k) {
  if (n < k || k < 0) return 0;
  return facts(n)*ifacts(k)*ifacts(n-k);
}

int main() {
    int n, m;
    cin >> n >> m;
    
    mint ans = comb(m+n-1, 2*n-1);
    cout << ans << '\n';
    
    return 0;
}

标签:典型,return,operator,const,2n,mint,mod
From: https://www.cnblogs.com/Melville/p/18238564

相关文章

  • C#知识|封装典型的SQLServer数据库查询方法。
    哈喽,你好啊,我是雷工!前边学习封装了增删改的方法封装:《C#知识|通用数据访问类SQLHelper的编写》;本节继续学习将两种典型的查询方法封装成类。下边为学习笔记。01封装单一返回结果的封装在查看封装后的代码之前,可以先看下封装前代码的写法:《C#知识|通过ADO.NET实现应......
  • 典型的 OKR 周期,全流程落地指南(超详细收藏)
    最近有很多OKR的用户对我们问了同样的一个问题,也是很多刚刚开始推行OKR的企业比较关注的一点:关于落地OKR的整个生命周期中,各个时间节点上都需要做哪些工作?典型的OKR周期,来源:《这就是OKR》下面小T将以季度OKR为例,带大家一起探讨一下各个时间节点上都应该做哪些工作,来确保企业的OK......
  • 【电源专题】功率电感器啸叫原因及典型案例
    啸叫产生的原因        声波是在空气中传播的弹性波,人的可听到的频率范围大约20~20kHz。在DC-DC转换器的功率电感器中,当流过人耳可听范围频率的交流电流以及脉冲波时,电感器主体会发生振动,该现象称为"线圈噪音",有时也称为啸叫。        啸叫一般是由电感器产......
  • 关于打印泄密的典型案例分享
    案例一:遗留在打印机的敏感文件情景:一家大型制药公司的一名员工在下班前打印了一些包含新药品研发数据的文件。由于急于离开,他忘记了取走这些文件。第二天,一名新入职的员工发现了这些文件,并在无意中将其拍照分享到了社交媒体,导致敏感信息泄露。教训:企业应该实施严格的打印管理......
  • AR精灵——风险分析和典型用户
    风险分析典型用户典型用户一名字:盛宇伟年龄:28岁,收入:每月约8000元代表的用户在市场上的比例和重要性:虽然使用AR精灵的付费用户比例较少,但他们对产品的热爱和忠诚度很高,他们的反馈和建议对产品的改进至关重要。使用这个软件的典型场景:李梅在下班后回到家中,打开AR精灵,通过AR......
  • 远光九天平台入选2024全国企业数字化应用创新典型案例
    4月25日至29日,由科技部、国家发展改革委、工业和信息化部、国务院国资委、中国科学院、中国工程院、中国科协、北京市人民政府共同主办的2024中关村论坛在北京召开。远光软件受邀出席2024中关村论坛平行论坛之一——全球数字化应用创新论坛,其倾力打造的远光九天智能一体化云平台(简......
  • C语言程序设计——字符串典型题练习
    1、计算一个字符串中最大的重复子串的字符的数量/********************************************************************* name : CalSubStrMaxCnt* function:计算一个字符串中最大的重复子串的字符的数量* argument:* @str:需要查找的字符串的地址* * ret......
  • 软件开发与创新-ColorFinder风险分析和典型用户
    典型用户:风险分析......
  • 主要风险和典型用户
    主要风险人力资源风险团队成员可能对消防系统的了解比较简单,不够明确。用户类型比较少,一般为小区业主和小区物业人员。财务风险创收途径单一,可能存在投资风险。市场需求不及预期或竞争激烈可能导致项目无法达到预期的回报。环境风险可能存在其他同类型产品等竞争对手......
  • ClubSphere项目主要风险和典型用户
    一.项目风险分析机会风险一、市场风险:1.市场接受度:市场对于我们软件的接受时间不确定,对我们的软件可能表现出较低的接受度。2.市场发展趋势:市场未来发展不确定,对于社团软件需求可能下降。3.市场知名度与拓展:软件前期在市场的知名度不高影响不大,极有可能被市场淘汰。4.市场宣......