题解 积木

传送门

很神仙的题

发现要求的东西是多重集排列的形式,拆不开式子
暴力可以枚举值域
然后考虑正解:
是个「可重集排列转组合数路径方案DP」
发现

\[\binom {a_i+a_j+b_i+b_j+c_i+c_j}{a_i+a_j,b_i+b_j,c_i+c_j}=\binom {a_i+a_j+b_i+b_j+c_i+c_j}{a_i+a_j+b_i+b_j}\times\binom {a_i+a_j+b_i+b_j}{a_i+a_j} \]

然后这个东西是从点 \((-a_i, -b_i, -c_i)\) 到点 \((a_j, b_j, c_j)\) 的方案数
于是可以DP
但是这么多起始点枚举每个做一遍就T了
于是可以将多个DP合为一个,在每个起始点处+1即可
然后减去从自己到自己的方案数,将最终答案除以2即可

  • \(\binom {a_i+a_j+b_i+b_j+c_i+c_j}{a_i+a_j,b_i+b_j,c_i+c_j}=\binom {a_i+a_j+b_i+b_j+c_i+c_j}{a_i+a_j+b_i+b_j}\times\binom {a_i+a_j+b_i+b_j}{a_i+a_j}\),用来将可重集排列转为组合数路径方案数(更高维的情况也能这么拆)
  • \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n (a_i+a_j)!\) 每个 \((a_i+a_j)!\) 前的系数就是 \((\sum x^{a_i})^2\) 展开后每一项前面的系数,因为需要NTT所以暂时鸽了
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 200010
#define ll long long
//#define int long long

char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline int read() {
	int ans=0, f=1; char c=getchar();
	while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
	while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
	return ans*f;
}

int n;
int a[N], b[N], c[N];
ll fac[N], inv[N], dp[310][310][310], ans;
const int dlt=152;
const ll mod=1e8+7;

signed main()
{
	freopen("cyj.in", "r", stdin);
	freopen("cyj.out", "w", stdout);
	
	n=read();
	for (int i=1; i<=n; ++i) a[i]=read(), b[i]=read(), c[i]=read(), ++dp[-a[i]+dlt][-b[i]+dlt][-c[i]+dlt];
	fac[0]=fac[1]=1; inv[0]=inv[1]=1;
	for (int i=2; i<N; ++i) fac[i]=fac[i-1]*i%mod;
	for (int i=2; i<N; ++i) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
	for (int i=2; i<N; ++i) inv[i]=inv[i-1]*inv[i]%mod;
	for (int i=-150; i<=150; ++i)
		for (int j=-150; j<=150; ++j)
			for (int k=-150; k<=150; ++k)
				dp[i+dlt][j+dlt][k+dlt]=(dp[i+dlt][j+dlt][k+dlt]+dp[i-1+dlt][j+dlt][k+dlt]+dp[i+dlt][j-1+dlt][k+dlt]+dp[i+dlt][j+dlt][k-1+dlt])%mod;
	for (int i=1; i<=n; ++i) ans=(ans+dp[a[i]+dlt][b[i]+dlt][c[i]+dlt]-fac[2*a[i]+2*b[i]+2*c[i]]*inv[2*a[i]]%mod*inv[2*b[i]]%mod*inv[2*c[i]]%mod)%mod;
	printf("%lld\n", (ans*inv[2]%mod+mod)%mod);
	
	return 0;
}
posted @ 2022-01-01 08:18  Administrator-09  阅读(4)  评论(0编辑  收藏  举报