NC21207. msc的背包
描述
输入描述
一行三个整数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; }