Luogu P1999
初中数学老师在平面几何的第一节课就和我们说过:
点动成线,线动成面,面动成体。
即,由
因此我们考虑一个二维的正方形平移得到三维的正方体的过程:
如果我们以平面的个数作为研究对象,不难看出,正方体中存在的平面有如下两个来源:
- 原来图形中的平面在经过平移后数量翻倍
- 原来的图形中的每一条线段在经过平移后都生成一个新的平面
推广到普遍结论:
维元素中的 维元素在经过平移后数量翻倍 维元素中的 维元素在经过平移后都生成一个新的 维元素
因此,如果我们设
优化一下空间,我们可以写出如下的代码:
f[0][1]=1;//为了防止负下标溢出,将j统一加一
for(int i=1;i<=a;i++)
for(int j=i+1;i>0;j--)
f[j]=(2*f[j]+f[j-1])%Mod;
cout<<f[b+1]<<endl;
但是由于时间复杂度太过爆炸TLE了五个点……
接下来可以考虑根据生成函数优化:
设
可以得出:
则有:
根据二项式定理:
则有:
因此只需要
代码:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll fac[100005]={1},inv[100005];
constexpr ll Mod=1e9+7;
ll qpow(ll a,ll b){//快速幂
ll ans=1;
while(b){
if(b&1)ans=ans*a%Mod;
a=a*a%Mod;
b>>=1;
}
return ans;
}
int main(){
int a,b;cin>>a>>b;
if(a<b)return cout<<0,0;
for(int i=1;i<=a;i++)fac[i]=fac[i-1]*i%Mod;
inv[a]=qpow(fac[a],Mod-2);//费马小定理
for(int i=a-1;i>=0;i--)inv[i]=inv[i+1]*(i+1)%Mod;
cout<<qpow(2,a-b)*fac[a]%Mod*inv[b]%Mod*inv[a-b]%Mod;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类