题面

题解

直接求解比较麻烦,考虑将问题进行转化。

设序列\(a = \{3, 1, 4, 2, 5\}, b = \{3, 2, 4, 1, 5\}\),那么我们构造一个正方形方格,将\(a\)放在横行,\(b\)放在竖行,可以画出下图。

那么我们可以发现,方案数就是从左上走到右下的不同序列个数。

这样我们可以\(\texttt{d}\texttt{p}\),设\(f[i][j]\)表示走到\((i, j)\)的方案数,那么显然\(f[i][j] = f[i - 1][j] + f[i][j - 1]\)。

不过这样转移发现有重复。考虑到\(a_i = b_j\)是\(f[i][j]\)出现重复的必要条件,通过推导可以得出方程:\(f[i][j] = f[i][j - 1] + f[i - 1][j] + [a_i = b_j]\sum_{k \geq 1}[a_{i - k} = b_{j - k}]f[i - k][j - k]\mathrm{C}(t - 1)\),其中\(\mathrm{C}\)表示卡特兰数,\(t\)表示\(1\)到\(k\)之间有多少个\(l\)满足\(a_{i - l} = b_{i - l}\)。

由于\(a_i = b_j\)只有\(n\)对,所以时间复杂度为\(\mathrm{O}(n ^ 2)\)。

代码

#include <cstdio>
#include <algorithm>
#include <vector>
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout) inline int read()
{
int data = 0, w = 1; char ch = getchar();
while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = getchar();
return data * w;
} const int N(2010), Mod(1e9 + 7);
int n, m, fac[N], inv[N], A[N], B[N], f[N][N];
inline int C(int n) { return 1ll * fac[n << 1] * inv[n] % Mod * inv[n + 1] % Mod; }
int fastpow(int x, int y)
{
int ans = 1;
for (; y; y >>= 1, x = 1ll * x * x % Mod)
if (y & 1) ans = 1ll * ans * x % Mod;
return ans;
} int main()
{
n = read(), m = n << 1, fac[0] = inv[0] = 1, f[1][1] = 1;
for (int i = 1; i <= m; i++) fac[i] = 1ll * fac[i - 1] * i % Mod;
inv[m] = fastpow(fac[m], Mod - 2);
for (int i = m - 1; i; i--) inv[i] = 1ll * inv[i + 1] * (i + 1) % Mod;
for (int i = 1; i <= n; i++) A[i] = read();
for (int i = 1; i <= n; i++) B[i] = read();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
if (i > 1 || j > 1) f[i][j] = (f[i - 1][j] + f[i][j - 1]) % Mod;
if (A[i] == B[j]) for (int k = 1, cnt = 0; k < i && k < j; k++)
if (A[i - k] == B[j - k])
f[i][j] = (f[i][j] - 1ll * C(cnt) *
f[i - k][j - k] % Mod + Mod) % Mod, ++cnt;
}
printf("%d\n", f[n][n]);
return 0;
}

AT1879 2 つの山札的更多相关文章

  1. [ARC053D]2 つの山札

    题意:给定排列$a_{1\cdots n},b_{1\cdots n}$,执行以下操作$2n-2$次来生成一个长度为$2n-2$的序列:选择$a,b$之一(选择的序列长度要$\geq2$),删除它的第 ...

  2. HDU2063 过山车

    过山车 RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是, ...

  3. HDOJ 2063 过山车

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  4. Xamarin.Android之山有木兮之木有枝,心悦君兮君不知。

    Xamarin.Android之山有木兮之木有枝,心悦君兮君不知. 第一步,写项目中的第一个界面. <?xml version="1.0" encoding ="  ...

  5. hdu 2063 过山车(匈牙利算法模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory ...

  6. HDU- 2063 过山车

    http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车//我的第一个二分匹配 Time Limit: 1000/1000 MS (Java/Others) ...

  7. hdoj 2063 过山车【匈牙利算法+邻接矩阵or邻接表】

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  8. centos 6+安装山逗斯骚尅特(本文内容来自都比更具帝)

    系统支持:CentOS 6+,Debian 7+,Ubuntu 12+ 内存要求:≥128M 关于本脚本 一键安装 Shadowsocks-Python, ShadowsocksR, Shadowso ...

  9. 大龄剩女四大结局:孤寡 后妈 拉拉 出家 宽带山KDS-宽带山社区-第一城市消费门户

    大龄剩女四大结局:孤寡 后妈 拉拉 出家 宽带山KDS-宽带山社区-第一城市消费门户 主题:大龄剩女四大结局:孤寡 后妈 拉拉 出家

随机推荐

  1. Qt Creator 的下载与安装

    一.Qt和Qt Creator的区别 Qt是C++的一个库,或者说是开发框架,里面集成了一些库函数,提高开发效率. Qt Creator是一个IDE,就是一个平台,一个开发环境,类似的比如说VS,也可 ...

  2. iOS - 架构模式 - 解密 MVC、MVP、MVVM、VIPER架构

    在 iOS 中使用 MVC 架构感觉很奇怪? 迁移到MVVM架构又怀有疑虑?听说过 VIPER 又不确定是否真的值得切换? 相信你会找到以上问题的答案,如果没找到请在评论中指出. 你将要整理出你在 i ...

  3. pandas-04 多级index操作

    pandas-04 多级index操作 在pandas中可以为series和dataframe设置多个index,也就是说可以有多级index和column.这样可以对pandas的操作更加灵活. i ...

  4. synchronized关键字的使用

    synchronized关键字是java并发编程中常使用的同步锁,用于锁住方法或者代码块,锁代码块时可以是synchronized(this){}.synchronized(Object){}.syn ...

  5. EasyPOI导入导出Excel

    EasyPOI工具可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 导入maven依赖 <dependency> <group ...

  6. MySQL5.7应当注意的参数

    简介: 本篇文章主要介绍 MySQL 初始化应当注意的参数,对于不同环境间实例迁移,这些参数同样应当注意. 注: 本文介绍的参数都是在配置文件 [mysqld] 部分. server_id 和 log ...

  7. BIND 主从配置

    BIND 主从配置 环境:master:172.31.182.144slave:172.31.182.147 一.安装yum install bind bind-chroot  -y 二.master ...

  8. Kali Linux 2019.4发布了!解决Kali Linux 2019.4中文乱码问题

    2019年11月26日,kali Linux官网发布了Kali Linux 2019.4发行版,此版本做了很大的改动,界面焕然一新. Kali Linux 2019.4涉及到的一些新更新内容包括: 新 ...

  9. golang版本管理工具GO111MODULE

    在go1.11版本前,想要对go语言包进行管理,只能依赖第三方库实现,比如Vendor,GoVendor,GoDep,Dep,Glide等等. 1. 开启GO111MODULE 用环境变量 GO111 ...

  10. Linux crontab命令参数和时间格式说明

    crontab 是用来让使用者在固定时间或固定间隔执行程序之用 参数说明 选项 功能 -e 编辑crontab定时任务 -l 查询crontab任务 -r 删除当前用户所有的crontab任务 时间格 ...