当前位置: 首页 > news >正文

20260428 紫题训练

P3734 [HAOI2017] 方案数

相当于将二进制下为 \(0\) 的位置选至少 \(1\) 个变成 \(1\)

\(f_{i,j,k}\) 表示在三维坐标二进制下分别改变了 \(x,y,z\)\(0\) 的方案数。

注意这里不是三维的答案相乘,因为是有改变相当于移动是有顺序的,如 \((0,0,0)\to(0,1,0)\to(1,1,0)\)\((0,0,0)\to(1,0,0)\to(1,1,0)\) 是两种方案。

有转移:

\[f_{i,j,k}= \sum_{x=1}^{i-1} \binom{i}{x}f_{x,j,k} +\sum_{x=1}^{j-1} \binom{j}{x}f_{i,x,k} +\sum_{x=1}^{k-1} \binom{k}{x}f_{i,j,x} \]

解释(第一项,其它的是类似的):

对于 \(i\),可以考虑少改变 \(i-x\) 位得到 \(x\)。这些位置可以在 \(i\) 个位置任选,方案数为 \(\dbinom{i}{i-x}=\dbinom{i}{x}\)

由于每次移动坐标只能增大,先将所有障碍按字典序排序消除 DP 的后效性。

\(g_i\) 为到达第 \(i\) 个点且不经过前 \(i-1\) 个点的方案数。

转移时考虑容斥,用全部方案数减去不合法的方案数。

对于每个 \(j<i\),若满足 \(x_j\subseteq x_i\wedge y_j\subseteq y_i\wedge z_j\subseteq z_i\),则可能到达 \(i\)

\(P(x)\) 表示 \(x\) 二进制下 \(1\) 的数量。

\(j\) 到达 \(i\)\(f_{P(x_i)-P(x_j),P(y_i)-P(y_j),P(z_i)-P(z_j)}\) 种方案,记为 \(k\)

因此有:

\[g_{i}=f_{P(x_i),P(y_i),P(z_i)}-\sum_{j=1}^{i-1} [x_j\subseteq x_i\wedge y_j\subseteq y_i\wedge z_j\subseteq z_i]k\cdot g_j \]

为方便统计答案可以将终点也看作障碍点,由题目约束可知其排序后的位置一定在最后一个,答案即为 \(g_{o+1}\)

#include<bits/stdc++.h>
#define P(x) __builtin_popcountll(x)
using namespace std;
using ll=long long;
const int V=70,N=10005,P=998244353;
int n,f[N],C[V][V],vis[V];
struct Point{ll x,y,z;}a[N];
int T(int x){if(vis[x]) return vis[x];int res=0;for(int i=0;i<x;i++) res=(res+1ll*T(i)*C[x][i])%P;return res;
}
int DP(int x,int y,int z){return 1ll*T(x)*T(y)%P*T(z)%P;}
int main(){vis[0]=1;for(int i=0;i<V;i++) C[i][0]=1;for(int i=1;i<V;i++) for(int j=1;j<=i;j++)(C[i][j]=C[i-1][j-1]+C[i-1][j])>P?(C[i][j]-=P):0;scanf("%lld%lld%lld%d",&a[0].x,&a[0].y,&a[0].z,&n);for(int i=1;i<=n;i++) scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].z);sort(a,a+n+1,[](Point u,Point v){return u.x^v.x?u.x<v.x:u.y^v.y?u.y<v.y:u.z<v.z;});auto Out=[](int x,int y){return a[x].x&a[y].x^a[y].x|a[x].y&a[y].y^a[y].y|a[x].z&a[y].z^a[y].z;};for(int i=0;i<=n;i++){f[i]=DP(P(a[i].x),P(a[i].y),P(a[i].z));for(int j=0;j<i;j++) if(!Out(i,j))f[i]=(f[i]-1ll*f[j]*DP(P(a[i].x^a[j].x),P(a[i].y^a[j].y),P(a[i].z^a[j].z)))%P;}return printf("%d",(f[n]+P)%P),0;
}
http://www.jsqmd.com/news/715904/

相关文章:

  • 3步掌握Bilibili评论数据采集:从零到精通的完整指南
  • 太原风电设备运输
  • [笔记] abc454_e LRUD Moving
  • 我发现了一个很好用的 AI 编程 Skill:/grill-me
  • 向量引擎、GPT Image 2、deepseek v4、api、key 全都讲明白了:这届AI开发,真不是只会调用就够了
  • 不止于T+0:用通达信自定义公式,打造你的手机短线交易‘驾驶舱’
  • Rocky Linux 9上配置Chrony时间同步的保姆级教程(含阿里云、腾讯云NTP源)
  • 给硬件新手的LPDDR4上电初始化避坑指南:从Vdd上电顺序到CKE使能的关键时序
  • 多商户电商系统
  • League Akari 终极指南:快速掌握英雄联盟本地化效率工具
  • AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用
  • MCP插件报错无法复现?别再盲目重启!用VS Code内置Tracing + MCP Protocol Inspector抓取完整通信链路(含HTTP/2帧级日志解析)
  • 洛谷 B3622:枚举子集(递归实现指数型枚举)← DFS
  • 国内开源Claw类智能体
  • 告别僵硬抓取:聊聊软体机器人手在康复训练和精密装配中的那些潜力应用
  • StarRailCopilot深度解析:如何用模块化架构实现崩坏星穹铁道全流程自动化
  • UE5数字孪生入门:用Cesium for Unreal加载本地高精度DEM,快速构建城市级三维地形基底
  • 低查重AI写教材指南:精选工具助力,3天完成40万字教材产出!
  • Android系统升级变快了?聊聊GKI和KMI背后那些对开发者实实在在的影响
  • 【笔记】asp.net 中,为什么第二次压测的单核性能是第一次压测的 3.2 倍
  • OpCore Simplify:如何用4个步骤完成黑苹果EFI自动化配置
  • redis的快速使用
  • Python PEP 263 深入解析:源文件编码那些事
  • 智能硬件监控新范式:LibreHardwareMonitor的架构解析与实战指南
  • 别再只调sklearn默认参数了!SVR、MLP、RF回归模型实战调参避坑指南
  • 如何快速构建黑苹果EFI:OpCore Simplify的终极简化指南
  • 保姆级教程:在Deepin/UOS上手动打包最新版QQ为deb安装包(附字体乱码修复)
  • Windows风扇控制终极方案:5步打造你的静音散热系统
  • 别再傻傻分不清!0.96寸OLED屏SPI和IIC接口到底怎么选?附STM32F103C8T6接线图
  • Driver Store Explorer:Windows驱动管理的终极可视化解决方案