【\(Description\)】

网格中每步可以走\((0,\cdots M_x,0\cdots M_y)\)中任意非零向量,有\(K\)种向量不能走,分别是\((r_1,r_1),(r_2,r_2),\cdots , (r_K,r_K)\)。 \(r_i\)一定是\(10\)的倍数。求从\((0,0)\)走到\((Tx,Ty)\)且走\(R\)步的方案数( \(Tx,Ty,Mx,My\leq 800,R\leq 1600,K\leq 50\))

无 【\(Input\;Sample\)】

无 【\(Output\;Sample\)】


【朴素做法一】

设\(F_{i,x,y}\)表示走\(i\)步到\((x,y)\)的方案数

\[F_{i,x,y}=\sum_{a=0}^{Mx} \sum_{b=0}^{My} F_{i-1,x-a,y-b}
\]

\[((a,b)\neq ((r_1,\cdots r_K,r_1,\cdots r_K))
\]

状态枚举\(i,x,y\),状态转移枚举\(a,b\)

\(O(1600\times 800^4\))


【朴素做法二】

在做法一的算法考虑如何优化。

我们注意到:状态转移这个东西,如果排除掉那\(K\)个不能走的向量,相当于对一个\(Mx\times My\)的矩阵求和

而这个东西是可以用二维前缀和维护的。所以我们只需枚举那\(K\)个不能走的向量,实现\(O(K)\)的转移

这里我们把\(K=50\)这个常数忽略掉

\(O(1600\times 800^2\))


【正解】

还是这个状态转移方程:

\[F_{i,x,y}=\sum_{a=0}^{Mx} \sum_{b=0}^{My} F_{i-1,x-a,y-b}
\]

我们发现:\(x,y\)是相互独立的,也就是说\(x\)轴上的转移与\(y\)轴上的转移是没有关系的

所以我们完全可以开两个数组:

\(f_{i,x}\)表示在一维上走\(i\)步到横坐标为\(x\)的方案数,\(g_{i,y}\)表示在一维上走\(i\)步到纵坐标为\(y\)的方案数

由此可得:

\[F_{i,x,y}=f_{i,x}\times g_{i,y}
\]

通过前缀和维护,即可\(O(R\times Tx)=O(1600\times 800)\)完成\(DP\)


这只是\(K=0\)的情况,如何排除那些不合法的步数?

我们设\(h_{i,z}\)表示走\(i\)步全都不合法,走到\((10z,10z)\)的方案数(\(r_i\)一定是\(10\)的倍数)

\[h_{i,z}=\sum_{j=1}^K h_{i-1,z-r_j}
\]

还有一个细节,由于\((0,0)\)也是不合法的,那就添加一个\(r_0=0\)即可

这就要用到容斥原理了。

即可得到答案:

\[\sum_{i=0}^R \sum_{z=0}^{\frac{min(Tx,Ty)}{10}} (-1)^i \times h_{i,z} \times f_{R-i,Tx-10z} \times g_{R-i,Ty-10z} \times C_R^i
\]

这里乘上\(C_R^i\)是因为我们并不知道那\(i\)个不合法的步是那几步

最后这个容斥的复杂度是\(O(R\times \frac{min(Tx,Ty)}{10})=O(1600\times 80)\)

那么就做出来了

代码我就不贴了吧,因为只要想出做法,就只是一个简单的\(DP\)了。

主要考查的是思维

TC SRM498 Div1 1000PT(容斥原理+DP)的更多相关文章

  1. [CF245H] Queries for Number of Palindromes (容斥原理dp计数)

    题目链接:http://codeforces.com/problemset/problem/245/H 题目大意:给你一个字符串s,对于每次查询,输入为一个数对(i,j),输出s[i..j]之间回文串 ...

  2. 2018.07.13 [HNOI2015]落忆枫音(容斥原理+dp)

    洛谷的传送门 bzoj的传送门 题意简述:在DAG中增加一条有向边,然后询问新图中一共 有多少个不同的子图为"树形图". 解法:容斥原理+dp,先考虑没有环的情况,经过尝试不难发现 ...

  3. BZOJ 3622: 已经没有什么好害怕的了 [容斥原理 DP]

    3622: 已经没有什么好害怕的了 题意:和我签订契约,成为魔法少女吧 真·题意:零食魔女夏洛特的结界里有糖果a和药片b各n个,两两配对,a>b的配对比b>a的配对多k个学姐就可能获胜,求 ...

  4. BZOJ 1042:[HAOI2008]硬币购物(容斥原理+DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1042 [题目大意] 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4. 某人去 ...

  5. 【BZOJ3622】已经没什么好害怕的了 容斥原理+dp

    Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output 4 HINT 输入的2*n个数字保证全不相 ...

  6. Topcoder SRM 698 Div1 250 RepeatString(dp)

    题意 [题目链接]这怎么发链接啊..... Sol 枚举一个断点,然后类似于LIS一样dp一波 这个边界条件有点迷啊..fst了两遍... #include<bits/stdc++.h> ...

  7. bzoj 1042: [HAOI2008]硬币购物【容斥原理+dp】

    当然是容斥啦. 用dp预处理出\( f[i] \),表示在\( i \)价格时不考虑限制的方案数,转移方程是\( f[i]+=f[i-c[j]] \),用状压枚举不满足的状态容斥一下即可. #incl ...

  8. 「模拟赛20191019」B 容斥原理+DP计数

    题目描述 将\(n\times n\)的网格黑白染色,使得不存在任意一行.任意一列.任意一条大对角线的所有格子同色,求方案数对\(998244353\)取模的结果. 输入 一行一个整数\(n\). 输 ...

  9. ARC093F Dark Horse 容斥原理+DP

    题目传送门 https://atcoder.jp/contests/arc093/tasks/arc093_d 题解 由于不论 \(1\) 在哪个位置,一轮轮下来,基本上过程都是相似的,所以不妨假设 ...

随机推荐

  1. (转载)基于BIGINT溢出错误的SQL注入

    我对于通过MySQL错误提取数据的新技术非常感兴趣,而本文中要介绍的就是这样一种技术.当我考察MySQL的整数处理方式的时候,突然对如何使其发生溢出产生了浓厚的兴趣.下面,我们来看看MySQL是如何存 ...

  2. 【学习笔记】 $learn \ from \ failure \ ? ( 雾$

    \(1.\)变量名不要用 \(next\) ,在某些编译器里可能是关键词,可以用 \(nxt\) 代替 \(\\\) \(2.\)在判断某些条件时应该写成 flag = 条件 ? 1 : flag; ...

  3. 如何将dotnet core webapi发布到docker中…

    如何将dotnet core webapi发布到docker中 今天想起来撸一下docker,中途还是遇到些问题,但是这些问题都是由于路径什么的导致不正确,在这儿还是记录下操作过程,今天是基于wind ...

  4. MVC-路由扩展-限制浏览器

    根据路由原理,MVC每次都会走获取路由上下文数据. 自定义Route 调用,以及完善其他代码 运行结果,当在谷浏览器执行时:

  5. Golang Web入门(4):如何设计API

    摘要 在之前的几篇文章中,我们从如何实现最简单的HTTP服务器,到如何对路由进行改进,到如何增加中间件.总的来讲,我们已经把Web服务器相关的内容大概梳理了一遍了.在这一篇文章中,我们将从最简单的一个 ...

  6. 模拟HTTP请求调用controller

    原文参考本人的简书:https://www.jianshu.com/p/0221edbe1598 MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller调用,这样 ...

  7. 今天,VS Code 五岁了。

    时光飞逝,岁月如梭.今天,VS Code 迎来了 5 岁的生日. 回想起 VS Code 发布的那一天,仿佛还在昨天. 回顾 VS Code 这五年的发展,总是能给我们开发者带了无限的惊喜. 2015 ...

  8. Ubuntu忘记超级用户root密码,重新设置密码 转载

    原文链接:https://blog.csdn.net/weixin_37909391/article/details/80691601 Ubuntu版本:Ubuntu 16.04.3 LTS 1启动系 ...

  9. (c++ std) 查找 vector 中的元素

    You can use std::find from <algorithm>: std::find(vector.begin(), vector.end(), item) != vecto ...

  10. ubuntu 下 使用GTK+、sqlite3、c语言的学生系统

    使用GTK+2.0.sqlite3数据库.c语言 的简易的学生管理系统 实现了基本的增删查改 效果图: