[RC-04] 0 1 背包

[RC-04] 01 背包

 题目描述

有一个容积为无穷的背包,你要往里面放物品。

你有 n个物品,第 i 个体积为 ai。

你有一个幸运数字 p,若放入的物品体积和为 k,你会得到 p^k$的收益。特别地,0^0=1。

求所有 2^n 种放入物品的方案的收益和。答案很大,因此请输出它对 $998244353$ 取模的值。

 输入格式

第一行两个整数 n,p。

接下来一行 n 个正整数 a1~an,描述这 n 个物品的体积。

## 输出格式

输出一个整数,为所有 2^n 种方案的收益和对 998244353 取模的值。

 样例输入 1

```
2 2
1 4
```

样例输出 1

```
51
```

//对于第i个物品都有两个选择 ,选择,则它的贡献就是乘上p^ai;不选,则它的贡献就是1

经过总结得

答案为 (p^a1+1)*(p^a2+1)*(p^a3+1)*(p^a4+1)*(p^a5+1)*……(p^an+1)

在求p^ai%mod时,可以使用快速幂进行计算

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
const int mod=998244353;
int qmi(int a,int k,int p)   //快速幂
{
    int ans=1;
    while (k)
    {
        if (k&1) ans=ans*a%p;
        k >>=1;
        a=a*a%p;
    }
    return ans;
}
signed main()
{
    int n,p;
    cin>>n>>p;
    int sum=1;
    for (int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        sum=sum*(qmi(p,x,mod)+1)%mod;    //公式
    }
    cout<<sum;
    return 0;
}