题解:
因为太菜了,没想出正解。
容易发现,三行间两两是独立的,最后乘起来就好了。
而两两间其实不难算,昨晚一直想dp去了,于是荒废半小时。
直接组合数学:
∑i=0min(n,m)CinCimi!
最后乘起来。
好像不怎么难,但我太菜了。
code:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#define LL long long
using namespace std;
const LL mod=998244353;
LL sum[5010],ny[5010];
LL a,b,c;
LL quick(LL a,LL b)
{
LL ans=1;
while(b)
{
if(b&1) (ans*=a)%=mod;
(a*=a)%=mod;b>>=1;
}
return ans;
}
void pre()
{
sum[1]=1;ny[1]=1;ny[0]=1;sum[0]=1;
for(LL i=2;i<=5000;i++)
{
sum[i]=sum[i-1]*i%mod;
ny[i]=quick(sum[i],mod-2);
}
}
LL C(LL n,LL m){return sum[m]*ny[m-n]%mod*ny[n]%mod;}
LL solve(LL n,LL m)
{
LL ans=0;
LL t=min(n,m);
for(LL i=0;i<=t;i++)
ans=(ans+C(i,n)*C(i,m)%mod*sum[i]%mod)%mod;
return ans;
}
int main()
{
scanf("%lld %lld %lld",&a,&b,&c);
pre();
printf("%lld",solve(a,b)*solve(a,c)%mod*solve(b,c)%mod);
}