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

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

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

那么对于每个维度而言,它必须从 \(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. uniapp医院预约挂号微信小程序

    开头感言:最近看小程序很火,也想弄一个看看,用了一些时间从0开始写,也记录了一些笔记,自己用框架写的模板,不是很精美,后面会慢慢优化,功能也是后面慢慢加上去的, 其中功能这块,起初只是一些简单的功能, ...

  2. 第三十一个知识点:Game Hopping证明

    第三十一个知识点:Game Hopping证明 关于安全证明, 目前主流的方法有安全归约证明 (由 single game 实现) 和 Game Hopping (由 game sequence 实现 ...

  3. Springcloud-alibaba学习实践(2)- nacos&Eureka Server服务注册实践

    前言:上一篇已搭建好了springcloud服务注册中心(Nacos&Eureka Server),本篇继续代码实践,注册服务到服务中心,本篇只是演示了两种注册中心,后续我们以Nacos注册中 ...

  4. xpath如何使用正则、xpath定位svg标签、xpath常用集合

    自己用到的xpath都收集下咯!!! 持续更新本页面 xpath查找svg图标 xpath('//*[local-name() = "svg" and @class="_ ...

  5. java运算符1

    一:算术运算符(+,  -,   *,  /,  ++,  --, ) 1.+号 :可以做加法运算(加号两边为字符和数字).正数表示 字符串连接符:只要+号两边其中有一边有字符串,输出时加号就充当连接 ...

  6. Selenium_浏览器窗口大小(6)

    import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driv ...

  7. Flask + flask_sqlalchemy + jq 完成书籍展示、新增、删除功能

    后端代码 from flask import Flask, render_template, request, jsonify from flask_wtf.csrf import CSRFProte ...

  8. springboot + mybatis plus使用insert 语句并返回主键

    mapper文件 映射文件中在insert中设置useGeneratedKeys为true,keyProperty设置为主键名称 <insert id="addEmployees&qu ...

  9. 嫌Excel VBA执行速度慢,这些建议你一定要看

    Excel是办公利器,这无需多言.尤其在办公室,Excel用的熟练与否,会的Excel知识点多不多,很大程度上决定了你工作是否高效,能否按时打卡下班.可我们也时常听到这样的吐槽:Excel好是好,可就 ...

  10. 计算机视觉--CV技术指南文章汇总

    前言  本文汇总了过去本公众号原创的.国外博客翻译的.从其它公众号转载的.从知乎转载的等一些比较重要的文章,并按照论文分享.技术总结三个方面进行了一个简单分类.点击每篇文章标题可阅读详细内容 欢迎关注 ...