分析:
这题挺有意思的 考虑起来有点麻烦
首先 \(n\) 维空间的点数 为 \(2^n\) 因为每往外延伸一条边 就多出两个点
然后考虑递推 设 \(f_{i,j}\) 表示 \(i\) 维空间内 含有 \(j\) 维空间的个数
从 \(3\) 维空间开始推\(f_{3,0}=8\) 因为 \(2^3=8\) 前面已经得出了\(f_{3,1}=12\) 因为每个点可以延伸出 \(3\) 条边 每条边连着 \(2\) 个点 那就是 \(\frac{f_{3,0}\times3}{2}=12\)\(f_{3,2}=6\) 因为每条边可以延伸出 \(2\) 个面 每个面连着 \(4\) 条边 就是\(\frac{f_{3,1}\times 2}{4}=6\)\(f_{3,3}=1\) 虽然不用解释 但还是需要模拟上面的过程
每个面延伸出\(1\)个立方体 每个立方体连着\(6\)个面
那就是 \(\frac{f_{3,2}\times 1}{6}=1\)
分母都是\(j\times 2\) 分子是\(f_{i,j-1}\times (i+1-j)\)
那么\(f_{i,j}=\frac{f_{i,j-1}\times(i+1-j)}{j\times 2}\)
先求出\(2^a\) 也就是\(f_{a,0}\)\(f_{n_,i}=\frac{f_{n,i-1}\times(n+1-i)}{i\times2}\)
由于要除 又要\(mod\) \(1e9+7\) 是质数 就乘 \(i\times2\) 关于 \(mod\) \(1e9+7\) 的乘法逆元 费马小定理即可
CODE:
点击查看代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+5,Mod=1e9+7;
ll a,b,f[N];
ll ksm(ll a,ll k)
{
ll res=1;
while(k)
{
if(k&1) (res*=a)%=Mod;
k>>=1;
(a*=a)%=Mod;
}
return res;
}
int main(){
scanf("%lld%lld",&a,&b);
f[0]=ksm(2,a);
for(int i=1;i<=b;i++)
f[i]=(f[i-1]*(a+1-i))%Mod*ksm((i<<1),Mod-2)%Mod;
printf("%lld",f[b]);
return 0;
}