Not Too Close 题解
题号太长就不放在题目里了,给个链接。
题意简述
一张无向图有
题目分析
考虑在每个图上将到点
设
- 下一层的点具体是哪些:
- 下一层内点互相之间的连边情况:
- 该层与下一层之间连边情况:
回到原问题,我们只计算前
总时间复杂度为
代码实现
#include<bits/stdc++.h> using namespace std; int n,d,mod,pow2[45010],f[160][160][160],C[160][160],ans; int main() { scanf("%d%d%d",&n,&d,&mod); pow2[0]=1; for(int i=1;i<=n*n;i++) pow2[i]=(pow2[i-1]<<1)%mod;//预处理 2 的幂 for(int i=0;i<=n;i++) C[i][0]=C[i][i]=1; for(int i=2;i<=n;i++) for(int j=1;j<i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;//组合数 f[0][1][1]=1; for(int i=0;i<d;i++) for(int j=i;j<=n;j++) for(int k=1;k<=j-i+1;k++) if(f[i][j][k]) for(int tmp=f[i][j][k],l=1;l<=n-j-d+i+1;l++) tmp=1ll*tmp*(pow2[k]-1)%mod,f[i+1][j+l][l]=(f[i+1][j+l][l]+1ll*tmp*pow2[l*(l-1)/2]%mod*C[n-j-1][l-(i+1==d)]%mod)%mod;//上文提到的三种情况乘法原理乘在一起就行了 for(int i=d;i<=n;i++) for(int k=1;k<=n;k++) ans=(ans+1ll*f[d][i][k]*pow2[(n-i)*(n-i-1)/2+(n-i)*k]%mod)%mod;//第 D 层统计答案 printf("%d",ans); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端