列表

详情


NC21207. msc的背包

描述

msc是个可爱的小女生,她喜欢许许多多稀奇古怪的小玩意。
一天,msc得到了一个大小为k的背包,她决定去买东西。
商店里有n种大小为1的物品和m种大小为2的物品。
由于msc希望买的东西尽量多,所以msc不希望买完东西之后背包还有空位(即买的所有东西的体积和必须等于k)。
她想知道自己有多少种购买物品的方案。
两种方案不同当且仅当存在一种物品在两种方案中的数量不同。

输入描述

一行三个整数n,m,k,分别表示大小为1的物品的种类数和大小为2的物品的种类数以及背包的容量。

输出描述

一行一个整数表示答案,由于答案可能很大,所以请对998244353取模后输出。

示例1

输入:

4 5 454

输出:

605690007

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 440ms, 内存消耗: 616K, 提交时间: 2019-11-21 16:25:13

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int mod = 998244353;

inline ll qp(ll a, ll b, ll mod) {
	ll ret = 1;
	ll now = a % mod;
	for (; b; b >>= 1) {
		if (b & 1) ret = ret * now % mod;
		now = now * now % mod;
	}
	return ret;
}

ll n, m, k;

int main () {
	cin >> n >> m >> k;
	ll c1 = 1, c2 = 1;
	for (ll i = 1; i <= n + m - 1; i++)
		c1 = c1 * qp(i, mod - 2, mod) % mod;
	ll x = (k - (k & 1)) / 2;
	for (ll i = x + 1; i <= x + n + m - 1; i++)
		c1 = c1 * i % mod;
	if (k & 1) c2 = n;
	else c2 = 1;
	ll res = 0;
	for (int i = (k & 1); i <= n; i += 2) {
		(res += c1 * c2 % mod) %= mod;
		c1 = c1 * ((k - i) / 2) % mod * qp((k - i) / 2 + n + m - 1, mod - 2, mod) % mod;
		c2 = c2 * (n - i - 1) % mod * (n - i) % mod * qp(1ll * (i + 1) * (i + 2), mod - 2, mod) % mod;
	}
	printf("%lld\n", res);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 434ms, 内存消耗: 612K, 提交时间: 2018-11-14 18:32:47

#include<iostream>
#include<cstdio>
typedef long long ll;
const ll mod=998244353;
ll qpow(ll x,ll y) {
    ll res=1;
    for(;y;y>>=1,x=x*x%mod) if(y&1) res=res*x%mod;
    return res;
}
int n,m,k;
int main() {
    scanf("%d%d%d",&n,&m,&k);
    ll ans=0,L=1,R=1;
    for(int i=1,c=k/2+n+m-1;i<n+m;i++,--c) R=R*c%mod*qpow(i,mod-2)%mod;
    int pre=k/2+n+m-1;
    for(int i=0;i<=n;i++) {
        if(i) L=L*(n-i+1)%mod*qpow(i,mod-2)%mod;
        if(!((k-i)&1)) {
            ans+=L*R%mod;
            R=R*(pre-n-m+1)%mod*qpow(pre,mod-2)%mod;--pre;
        }
    }
    printf("%lld\n",ans%mod);
    return 0;
}

上一题