LOJ#6501. 「雅礼集训 2018 Day4」Cube 题解

题目链接

答案为 \(\binom{n}{m} \times 2^{n-m}\)

证明1 :

考虑枚举\(m\)维作为超立方体,令剩余的\(n-m\)维在\(0/1\)中任意选择,方案即为选出\(m\)维的方案和\(n-m\)维选择\(0/1\)的方案的乘积即\(\binom{n}{m} \times 2^{n-m}\)

证明2 :

首先 \(f_{1,1} = 1,f_{1,x(x>1)} = 0.\)

对于 \(f_{n(n>1),m},\) 我们尝试寻找其递推式。

不难发现我们要么是当前一维拿来确定,即在两个\(n-1\)维超立方体中找出\(m-1\)维超立方体的方案数,为 \(f_{n-1,m-1}.\)

或者我们直接递归到两个子超立方体中,此时的答案为 \(2f_{n-1,m}.\)

不难发现答案即为\([x^m](2x+1)^n = \binom{n}{m} \times 2^{n-m}.\)

code :

#include <bits/stdc++.h>
#define LL long long
using namespace std;
template <typename T> void read(T &x){
	static char ch; x = 0,ch = getchar();
	while (!isdigit(ch)) ch = getchar();
	while (isdigit(ch)) x = x * 10 + ch - '0',ch = getchar();
}
inline void write(int x){if (x > 9) write(x/10); putchar(x%10+'0'); }
const int P = 998244353,N = 100005;
int fac[N],inv[N],nfac[N],pw[N];
inline int C(int n,int m){ return (LL)fac[n] * nfac[m] % P * nfac[n-m] % P; }
int main(){
	int i;
	fac[0] = nfac[0] = inv[0] = fac[1] = nfac[1] = inv[1] = pw[0] = 1; pw[1] = 2;
	for (i = 2; i <= 100000; ++i)
		pw[i] = pw[i-1] * 2 % P,fac[i] = (LL)fac[i-1] * i % P,inv[i] = (LL)(P-P/i) * inv[P%i] % P,nfac[i] = (LL)nfac[i-1] * inv[i] % P;
	int T,n,m;
	read(T);
	while (T--) read(n),read(m),write((LL)C(n,m) * pw[n-m] % P),putchar('\n');
	return 0;
}
posted @ 2020-09-06 09:44  srf  阅读(227)  评论(0编辑  收藏  举报