「洛谷P1999」高维正方体

imageimage\(link\)

分析:

这题挺有意思的 考虑起来有点麻烦

首先 \(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值