可以发现,如果一个整体一起考虑是不能找到一个合适的状态来描述这个情形的。

因此可以考虑寻找整体的反面,也就是将每个维度分开考虑。

不难发现每个维度本质上是一样的,因此不需要考虑不同维度之间的区别。

那么对于每个维度而言,它必须从 \(0\) 出发再回到 \(0\),那么假设它往外走了 \(k\) 步,那么往内也必然走了 \(k\) 步。

不难发现每个维度本质上是在总共的 \(T\) 步中选择了 \(k\) 个位置在这个维度上往外走,再选择 \(k\) 个位置往内走,于是就可以直接考虑 \(dp\) 了。

令 \(dp_{i, j}\) 表示前 \(i\) 个维度一共走了 \(j\) 步的方案,假设最终一共走的步数为 \(T\),那么有转移:

\[dp_{i, j} = \sum\limits_{k = 0} ^ {\lfloor \frac{j}{2} \rfloor} dp_{i - 1, j - 2 \times k} \times \dbinom{T - j + 2 \times k}{k} \times \dbinom{T - j + k}{k}
\]

这样就可以 \(O(n ^ 3)\) 地算了,但每次查询 \(T\) 都会改变,怎么办呢?

回到 \(dp\) 转移之前的这个流程,不难发现实质上本质上是 \(2n\) 个多重集合排列的问题。

回忆一下这个问题:\(m\) 个集合第 \(i\) 个集合内有 \(a_i\) 个元素不标号,满足 \(\sum a_i = n\),问排列的方案数,不难发现即为:

\[\frac{n!}{a_1!a_2! \cdots a_m!}
\]

可以发现分母是与 \(n\) 无关的,而分子又是与每个 \(a_i\) 无关的。

因此我们在 \(dp\) 的过程中先不计算分子对答案的贡献,只计算分母对答案的贡献,最后查询直接乘 \(T!\) 即可。

实际上也可以考虑转移的时候以插入的形式转移,本质上是一致的,在此不再赘述。

#include <bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for (int i = l; i <= r; ++i)
const int N = 200 + 5;
const int L = 200;
const int Mod = 1e9 + 7;
int n, T, Q, fac[N], inv[N], dp[N][N];
int read() {
char c; int x = 0, f = 1;
c = getchar();
while (c > '9' || c < '0') { if(c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int Inc(int a, int b) { return (a += b) >= Mod ? a - Mod : a;}
int Dec(int a, int b) { return (a -= b) < 0 ? a + Mod : a;}
int Mul(int a, int b) { return 1ll * a * b % Mod;}
int fpow(int a, int b) { int ans = 1; for (; b; a = Mul(a, a), b >>= 1) if(b & 1) ans = Mul(ans, a); return ans;}
int C(int n, int m) { return n < m ? 0 : Mul(fac[n], Mul(inv[m], inv[n - m]));}
int main() {
fac[0] = inv[0] = dp[0][0] = 1;
rep(i, 1, L) fac[i] = Mul(fac[i - 1], i), inv[i] = fpow(fac[i], Mod - 2);
rep(i, 1, L) rep(j, 0, L) rep(k, 0, j / 2)
dp[i][j] = Inc(dp[i][j], Mul(dp[i - 1][j - 2 * k], Mul(inv[k], inv[k])));
Q = read();
while (Q--) {
n = read(), T = read();
printf("%d\n", Mul(dp[n][T], fac[T]));
}
return 0;
}

值得一提的,广义上的正难则反就是从难点的对立面来考虑,比如:具体问题抽象化,抽象问题具体化,区间问题单点化等等。

SP19149 INS14H - Virus Revisited的更多相关文章

  1. Virus.Win32.Virlock.b分析

    0x00 样本说明 分析样本是被0b500d25f645c0b25532c1e3c9741667的样本感染得到.感染前的文件是Tcpview.exe,一款windows网络连接查看工具. 感染前后文件 ...

  2. csuoj 1394: Virus Replication

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1394 1394: Virus Replication Time Limit: 1 Sec  Mem ...

  3. sublimeText jsformat 插件被当做病毒 virus

    最近在个只可往他里面发邮件,不能往外上任何互联网的地方工作,用 sublimetext 要装个sublime 插件 jsformat 十分麻烦.用gmail邮箱发总是报病毒. 最后挨个尝试,发现是 j ...

  4. hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  5. HDU 3695 Computer Virus on Planet Pandora(AC自动机模版题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  6. hdu ----3695 Computer Virus on Planet Pandora (ac自动机)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  7. 最近碰到了一个病毒木马:virus.win32.ramnit.B

    由于 使用了 简单游 平台上的挂机工具: 番茄-自动人机对战免费版1217  ,使用了很久,头段时间家里电脑 360提示有病毒,本来我一直忽略的,但 我扫描了一下,大量的这个木马,于是 吧 简单游卸载 ...

  8. ZOJ 3430 Detect the Virus

    传送门: Detect the Virus                                                                                ...

  9. HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)

    Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...

随机推荐

  1. Normalization Methods

    目录 概 主要内容 Batch Normalization Layer Normalization Instance Normalization Group Normalization Ioffe S ...

  2. vmware虚拟IOS系统

    安装虚拟机     --以管理员的身份运行

  3. 5分钟搭建wordpress个人博客网站——宝塔傻瓜式部署,无坑系列,附赠主题和md插件[2021-12-31]

    一.前言 自从买了服务器,小编已经马不停蹄的学了两天服务搭建的知识,问了很多大佬,快速搭建自己的博客网站.有四种方式,我在这里全部分享给大家.自己已经搭建好,欢迎大家过来看一下,给你提供个思路哈! 小 ...

  4. Spring练习,使用注解的方式,完成模拟用户的正常登录。要求如下: 使用注解方式开发模拟用户的正常登录。

    相关 知识 >>> 相关 练习 >>> 实现要求: 在该实践案例中,使用注解的方式,完成模拟用户的正常登录. 要求如下: 使用注解方式开发模拟用户的正常登录. 实现 ...

  5. 2.spring系列之404异常的捕获

    回顾 我在之前发布了一篇spring统一返回的文章,最后提到是无法捕获404异常的,这里我们先来测试一下 @RestController public class TestController { @ ...

  6. CSS基础6之盒子模型1

    盒子概述 以下是盒子模型的一个图形解释 一.内边距(填充) 属性有: (1) padding  设置所有内边距 (2) padding-top  设置上边距 (3) padding-left 设置左边 ...

  7. spring controller获取web前端post数据乱码解决

    web.xml文件加上如下代码<!-- post请求乱码拦截器 --><filter> <filter-name>CharacterEncodingFilter&l ...

  8. 拓展 Array 方法

    为 Array 对象扩展了一个迭代器之后,就可以利用这个法代器进一步拓展 Array 的方法,使其能够完成更多的实用功能. Array.prototype.each = function( f ) { ...

  9. MongoDB之几种情况下的索引选择策略

    一.MongoDB如何选择索引 如果我们在Collection建了5个index,那么当我们查询的时候,MongoDB会根据查询语句的筛选条件.sort排序等来定位可以使用的index作为候选索引:然 ...

  10. HIVE优化学习笔记

    概述 之前写过关于hive的已经有两篇随笔了,但是作者依然还是一枚小白,现在把那些杂七杂八的总结一下,供以后查阅和总结.今天的文章介绍一下hive的优化.hive是好多公司都在使用的东西,也有好多大公 ...