可以先考虑没有障碍物的情况,设计状态\(f_{i,j,k}\),表示到达坐标 \((x,y,z)\)二进制下,\(x\)有\(i\)位,\(y\)有\(j\)位,\(z\)有\(k\)位的方案数。

得转移方程为:

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

对所有障碍物的位置和最终的终点一起考虑,先将这些点按\(x\)为第一关键字,\(y\)为第二关键字,\(z\)为第三关键字排序,保证后面转移的合法。

设\(g_i\)为到达第\(i\)个点且不经过排序后顺序该点之前的点的方案数。对于\(g_i\),计算时通过容斥,为从\((0,0,0)\)到该点不考虑障碍物的方案数,减去其他可以到达该点的点走过来的方案数,判断是否可以到达需看是否三维都是该点子集。

\(code:\)

#include<bits/stdc++.h>
#define maxn 20010
#define maxm 70
#define all 65
#define mod 998244353
#define lowbit(x) (x&(-x))
using namespace std;
typedef long long ll;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
ll n,m,r,tot;
ll f[maxm][maxm][maxm],g[maxn],C[maxm][maxm];
int get(ll x)
{
int cnt=0;
while(x) cnt++,x-=lowbit(x);
return cnt;
}
struct node
{
ll x,y,z;
int a,b,c;
void init()
{
a=get(x),b=get(y),c=get(z);
}
}p[maxn];
bool cmp(const node &a,const node &b)
{
if(a.x==b.x&&a.y==b.y) return a.z<b.z;
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int main()
{
read(n),read(m),read(r),read(tot);
for(int i=1;i<=tot;++i)
read(p[i].x),read(p[i].y),read(p[i].z),p[i].init();
p[++tot]=(node){n,m,r},p[tot].init(),sort(p+1,p+tot+1,cmp);
for(int i=0;i<=all;++i) C[i][0]=1;
for(int i=1;i<=all;++i)
for(int j=1;j<=i;++j)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
f[0][0][0]=1;
for(int i=0;i<=all;++i)
{
for(int j=0;j<=all;++j)
{
for(int k=0;k<=all;++k)
{
for(int x=1;x<=i;++x) f[i][j][k]=(f[i][j][k]+f[i-x][j][k]*C[i][x]%mod)%mod;
for(int x=1;x<=j;++x) f[i][j][k]=(f[i][j][k]+f[i][j-x][k]*C[j][x]%mod)%mod;
for(int x=1;x<=k;++x) f[i][j][k]=(f[i][j][k]+f[i][j][k-x]*C[k][x]%mod)%mod;
}
}
}
for(int i=1;i<=tot;++i)
{
g[i]=f[p[i].a][p[i].b][p[i].c];
for(int j=1;j<i;++j)
{
if((p[j].x&p[i].x)!=p[j].x||(p[j].y&p[i].y)!=p[j].y||(p[j].z&p[i].z)!=p[j].z) continue;
g[i]=(g[i]-g[j]*f[p[i].a-p[j].a][p[i].b-p[j].b][p[i].c-p[j].c]%mod+mod)%mod;
}
}
printf("%lld",g[tot]);
return 0;
}

题解 洛谷 P3734 【[HAOI2017]方案数】的更多相关文章

  1. 题解 [HAOI2017]方案数

    题目传送门 Solution 我们没有障碍的时候很好做,直接设 \(f_{i,j,k}\) 表示到 \((x,y,z)\) \(x\) 有 \(i\) 位为 \(1\),\(y\) 有 \(j\) 位 ...

  2. DP,数论————洛谷P4317 花神的数论题(求1~n二进制中1的个数和)

    玄学代码(是洛谷题解里的一位dalao小粉兔写的) //数位DP(二进制)计算出f[i]为恰好有i个的方案数. //答案为∏(i^f[i]),快速幂解决. #include<bits/stdc+ ...

  3. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  4. 题解-洛谷P4859 已经没有什么好害怕的了

    洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...

  5. 洛谷:P3281 [SCOI2013]数数 (优秀的解法)

    刷了这么久的数位 dp ,照样被这题虐,还从早上虐到晚上,对自己无语...(机房里又是只有我一个人,寂寞.) 题目:洛谷P3281 [SCOI2013]数数 题目描述 Fish 是一条生活在海里的鱼, ...

  6. 洛谷P4587 [FJOI2016]神秘数(主席树)

    题面 洛谷 题解 考虑暴力,对于询问中的一段区间\([l,r]\),我们先将其中的数升序排序,假设当前可以表示出\([1,k]\)目前处理\(a_i\),假如\(a_i>k+1\),则答案就是\ ...

  7. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  8. 题解 洛谷P1562 【还是N皇后】

    原题:洛谷P1562 这个题的原理和8皇后的原理是一模一样的,就是必须要用n个皇后把每一个行填满,同时满足每一列,每一行,每一条对角线只有一个棋子.但如果按照原来的方法暴打的话只有60分(优化亲测无效 ...

  9. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

随机推荐

  1. 不同类型数据库中LIKE语句使用

    不同数据库的LIKE语句使用略有差别,这里记录一下: Oracle数据库: SELECT *FROM userWHEREname LIKE CONCAT('%',#{name},'%')或SELECT ...

  2. 「从零单排canal 03」 canal源码分析大纲

    在前面两篇中,我们从基本概念理解了canal是一个什么项目,能应用于什么场景,然后通过一个demo体验,有了基本的体感和认识. 从这一篇开始,我们将从源码入手,深入学习canal的实现方式.了解can ...

  3. Day10-微信小程序实战-交友小程序-添加好友功能之创建并更新message信息

    1.首先要在 添加好友 这个按钮上添加一个事件,也就是在detail.wxml的添加好友这个按钮的哪里,添加一个点击事件 handleAddFriend 并且添加好友还要考虑,现在是已登陆状态还是未登 ...

  4. 基于opencv的车牌提取项目

    初学图像处理,做了一个车牌提取项目,本博客仅仅是为了记录一下学习过程,该项目只具备初级功能,还有待改善 第一部分:车牌倾斜矫正 # 导入所需模块 import cv2 import math from ...

  5. day10,day11—基本数据类型语法

    一.整形 1. base #在16进制中的位置 num = "b" v = int(num, base=16) print(v) #11 2. bit_length() # 1 1 ...

  6. Unicode 环境下的字符串的操作

    1.CString转int int i _ttoi( str ); 2.保存中文和读取中文: CSdtioFile在Unicode环境下默认是不支持中文的,若需要存储和读取中文需要设置代码页: #in ...

  7. 解决Centos7下中文显示乱码

    第一步:先查看是不是ctr的问题: SecureCRT的修改,选项→会话选项,将外观中的字符编码集修改为UTF-8即可,其他终端程序同理 如果不是则再参照如下文档操作:https://www.cnbl ...

  8. JSTL版本问题

    JSTL的版本有很多,和Servlet,jsp,tomcat都有版本兼容的问题,以下是收藏的相关帖子 JSTL不同版本和EL表达式的关联  https://www.cnblogs.com/yangzh ...

  9. java语言基础(五)_Scanner类_Random类_ArrayList类

    API API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的字典 ,是JDK中提供给程序员使用的类的说明文档.这些类将底层的代 ...

  10. Spring Cloud Alibaba系列(六)sentinel的实际应用

    一.sentinel的持久化配置 上一章中我们通过Dashboard来为Sentinel客户端设置各种各样的规则,但是这些规则默认是存放在内存中,极不稳定,无法用于生成环境,所以需要将其持久化. Da ...