LOJ6501「雅礼集训 2018 Day4」Cube

https://loj.ac/p/6501

考虑一个 (n-1) 维基础图形,在第 (n) 维度上移动适当距离,轨迹即变成 (n) 维基础图形
(n) 维基础图形中的 (m) 维基础图形数量为 (f_{n,m})
(n-1) 维基础图形中的某一 (m) 维基础图形,会在移动的起点和终点分别出现一次,也就是 (2f_{n-1,m})
(n-1) 维基础图形中的某一 (m-1) 维基础图形,在移动过程中,他的轨迹会形成一个 (m) 维基础图形留在这个 (n) 维基础图形中,也就是 (f_{n-1,m-1})
于是有了式子:(f_{n,m}=2f_{n-1,m}+f_{n-1,m-1})

讨论如何快速计算

[f_{n,m}=af_{n-1,m-1}+bf_{n-1,m},f_{0,0}=1 ]

有:

[inom{n}{m}a^mb^{n-m}=a imes inom{n-1}{m-1}a^{m-1}b^{n-m}+b imes inom{n-1}{m}a^{m}b^{n-m-1} ]

所以:

[f_{n,m}=inom{n}{m}a^mb^{n-m}=[x^m](ax+b)^n ]

因此本题答案即为 (inom{n}{m}2^{n-m})

#define mod 998244353
inline long long power(long long a,long long b){
	long long ans=1;
	while(b){
		if(b&1) ans=ans*a%mod;
		a=a*a%mod;b>>=1;
	}
	return ans;
}
#define N 100006
long long fac[N],inv[N],power2[N];
int main(){
	fac[0]=inv[0]=power2[0]=1;
	for(int i=1;i<N;i++) fac[i]=fac[i-1]*i%mod,power2[i]=power2[i-1]*2%mod;
	inv[N-1]=power(fac[N-1],mod-2);
	for(int i=N-2;i;i--) inv[i]=inv[i+1]*(i+1)%mod;
int $=read();while($--){
	int n=read(),m=read();
	printf("%lld
",fac[n]*inv[m]%mod*inv[n-m]%mod*power2[n-m]%mod);
}
	return 0;
}
原文地址:https://www.cnblogs.com/suxxsfe/p/15394707.html