2021牛客暑期多校训练营4 G.Product(容斥,模型转化)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021牛客暑期多校训练营4 G.Product(容斥,模型转化)相关的知识,希望对你有一定的参考价值。
一个序列 a a a的权值定义为 D ! ∏ i = 1 n ( a i + k ) ! \\frac{D!}{\\prod_{i=1}^n(a_i+k)!} ∏i=1n(ai+k)!D!
合法的序列 a a a满足 ∑ i = 1 n a i = D \\sum\\limits_{i=1}^n a_i=D i=1∑nai=D且 a i > = 0 a_i>=0 ai>=0
求所有合法序列的权值和模 998244353 998244353 998244353
其中 D < = 1 0 8 , n < = 50 , k < = 50 D<=10^8,n<=50,k<=50 D<=108,n<=50,k<=50
考虑先求
a n s 1 = ∑ a i > = 0 & & ( ∑ i = 1 n a i ) = D D ! ∏ i = 1 n a i ! ans1=\\sum\\limits_{a_i>=0\\&\\&(\\sum\\limits_{i=1}^n a_i)=D} \\frac{D!}{\\prod\\limits_{i=1}^n a_{i!}} ans1=ai>=0&&(i=1∑nai)=D∑i=1∏nai!D!
考虑 D ! ∗ ∏ i = 1 n 1 a i ! D!*\\prod\\limits_{i=1}^n \\frac{1}{a_i!} D!∗i=1∏nai!1的意义
相当于一个可重集排列问题, D D D个小球排成一排,第 i i i种小球有 a i a_i ai个,求排列的方案数
考虑现在 a i a_i ai的值不是固定的,相当于求一个给 D D D个小球分配颜色并排列的方案,这显然有更简单的算法
考虑拿出的第 i i i个小球排列在第 i i i个位置,那么它的颜色可以有 n n n种,总方案也就是 n D n^D nD
于是我们知道 a n s 1 = n D ans1=n^D ans1=nD
不过题目要求的是
a n s 2 = ∑ a i > = 0 & & ( ∑ i = 1 n a i ) = D D ! ∏ i = 1 n ( a i + k ) ! ans2=\\sum\\limits_{a_i>=0\\&\\&(\\sum\\limits_{i=1}^n a_i)=D} \\frac{D!}{\\prod\\limits_{i=1}^n (a_i+k)!} ans2=ai>=0&&(i=1∑nai)=D∑i=1∏n(ai+k)!D!
这样就用不了上面的结论了,考虑变形一下来使用上面的结论
a n s 2 = ∑ a i > = k & & ( ∑ i = 1 n a i ) = D + n k D ! ∏ i = 1 n a i ! = D ! ( D + n k ) ! ∗ n D + n k ans2=\\sum\\limits_{a_i>=k\\&\\&(\\sum\\limits_{i=1}^n a_i)=D+nk} \\frac{D!}{\\prod\\limits_{i=1}^n a_i!}=\\frac{D!}{(D+nk)!}*n^{D+nk} ans2=ai>=k&&(i=1∑nai)=D+nk∑i=1∏nai!D!=(D+nk)!D!∗nD+nk
这样肯定算多了,因为在这 n n n种颜色中,很多颜色没有分配够 k k k,有些颜色分配够了
这个需要容斥掉不合法的方案数,不妨定义 f [ i ] [ j ] f[i][j] f[i][j]表示 i i i个位置不合法,这些数字的和是 j j j共造成的贡献
f [ i ] [ j ] = f [ i − 1 ] [ j − q ] ∗ 1 q ! f[i][j]=f[i-1][j-q]*\\frac{1}{q!} f[i][j]=f[i−1][j−q]∗q!1
显然有 ( n i ) \\binom {n}{i} (in)种取法,不满足的位置贡献是 f [ i ] [ j ] f[i][j] f[i][j]
满足的位置按照上面的计算方式有 D ! ( D + n k − j ) ! ( n − i ) D + n k − j \\frac{D!}{(D+nk-j)!}(n-i)^{D+nk-j} (D+nk−j)!D!(n−i)D+nk−j的贡献,乘起来就好了
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e6+10;
const int mod = 998244353;
int n,k,D,a[ma以上是关于2021牛客暑期多校训练营4 G.Product(容斥,模型转化)的主要内容,如果未能解决你的问题,请参考以下文章