Atcoder 241


Atcoder 241

\(Ex. Card Deck Score\)

题意

给定\(N\)种物品,每种物品价值为\(A_i\),个数为\(B_i\)。现在要选取\(W\)个物品,设第\(i\)种物品选了\(K_i\)个,那么一种选法的总价值就是\(\prod_{i=1}^nA_i^{k_i}\),现在要你求所有方案的总价值和。答案对\(998244353\)取模

\(1\le N\le 16\) \(1\le W\le 10^{18}\) \(1\le A_i\le 998244353\) \(1\le B_i\le 10^{17}\)

保证\(A_i\)两两互不相等。

Sol

容易写出生成函数为\(F(x)=\prod_{i=1}^n\sum_{j=0}^{B_i}(A_ix)^j=\prod_{i=1}^n\frac{1-(A_ix)^{B_i+1}}{1-A_ix}\)

由于\(N\)最大为\(16\),所以分子可以在\(O(2^n)\)内求出所有项的系数,由于我们需要的是\([x^W]F(x)\),但分式不好计算,考虑乘积项。

考虑部分分式分解:\(\frac{1}{\prod_{i=1}^n(1-A_ix)}=\frac{c_1}{1-A_1x}+\frac{c_2}{1-A_2x}+...+\frac{1}{1-A_nx}\)

设当前求系数\(c_j\),那么将上面的式子变形为\(\frac{1}{\prod_{i=1\ and \ i!=j}^n(1-A_ix)}=\frac{c_1(1-A_jx)}{1-A_1x}+\frac{c_2(1-A_jx)}{1-A_2x}+...c_j+...+\frac{c_n(1-A_jx)}{1-A_nx}\)

\(x=A_j^{-1}\),在模\(998244353\)意义下,\(1-A_jA_j^{-1}=0\)。那么上式变为\(c_j=\frac{1}{\prod_{i=1\ and \ i!=j}^n(1-A_iA_j^{-1})}\)

\(\frac{c_i}{1-A_ix}=c_i\sum_{j=0}^{\infty}(A_ix)^j\),用级数展开。

\(F(x)=\prod_{i=1}^n\frac{1-(A_ix)^{B_i+1}}{1-A_ix}=\prod_{i=1}^n(1-(A_ix)^{B_i+1})\sum_{i=1}^nc_i\sum_{j=0}^{\infty}(A_ix)^j\)

#include 
using namespace std;
constexpr int P = 998244353;
using i64 = long long;
i64 power(i64 a, i64 b) {
    i64 res = 1LL;
    for (; b; b /= 2, a = a*a%P) {
        if (b % 2) {
            res =res*a%P;
        }
    }
    return res;
}

int main()
{
   ios::sync_with_stdio(false);
   cin.tie(nullptr);
   int n;
   i64 m;
   cin>>n>>m;
   vectorA(n),B(n),p(1<>A[i]>>B[i];
     B[i]++;
     i64 x=(-power(A[i],B[i])+P)%P;
     for(int j=0;j<1<c(n);
   for(int i=0;im) continue;
      //cout<

待更

相关