排列统计

\(Description\)

对于给定的一个长度为n的序列{B[n]},问有多少个序列{A[n]}对于所有的i满足:A[1]~A[i]这i个数字中有恰好B[i]个数字小等于i。其中{A[n]}为1~n的一个排列,即1~n这n个数字在序列A[I]中恰好出现一次。 数据保证了至少有一个排列满足B序列。

\(Input\)

输入的第1行为一个正整数N,表示了序列的长度。

第2行包含N个非负整数,描述了序列{B[i]}。

\(Output\)

输出仅包括一个非负整数,即满足的{A[i]}序列个数。

\(Sample Input\)

3

0 1 3

\(Sample Output\)

3

\(Hint\)

【样例说明】

  对于A序列为1~3的全排列分别对应的B序列如下(冒号左边为A序列,冒号右边为对应B的序列)

  1 2 3:1 2 3

  1 3 2:1 1 3

  2 1 3:0 2 3

  2 3 1:0 1 3

  3 1 2:0 1 3

  3 2 1:0 1 3

  所以有3个满足的A序列。

【数据说明】

  对于20%的数据,有N≤8;

  对于30%的数据,有N≤11且答案不大于20000;

  对于50%的数据,有N≤100;

  对于100%的数据,有N≤2000。

解题思路

其实很容易发现,当且仅当 \(B_i - B_{i-1} = {0 , 1 , 2}\) 时才有解

因为考虑到 \(B_i\) 和 \(B_{i-1}\) 的关系,前者是后者产生的数列再加入一个新的数

为了方便表达,记产生的数列为 \(a_{1..n}\)

那么新加入一个数,记为x , 它至多可以给 \(B_i\) 贡献 1(\(x <= i\)),此时可贡献的数从上限 \(i-1\) 提升到 \(i\) ,如果之前有一个数恰好等于 i,那么它又可以给 \(B_i\) 贡献 1

然后就找不到可贡献的了,即 \(B_i + 2 \geq B_{i-1}\) 时才可能构造数列

现在考虑如何求得答案

设 \(f_i\) 表示前 \(1..i\) 满足条件的数列数目,\(k = B_{i-1} - B_i\)

\[f_i =
\left \{
\begin{aligned}
f_{i-1} & & (k=0) \\
f_{i-1}[(i-B_{i-1})+(i-1-B_{i-1})] & & (k=1) \\
f_{i-1}(i-B_{i-1}-1)^2 & & (k=2)
\end{aligned}
\right.
\]

要用高精度!!!

代码参考

#include<cstdio>
using namespace std;
typedef long long LL; int b[2005] , n , ans[10005]; inline void mul(int x)
{
int g = 0;
for(register int i = 1; i <= ans[0]; i++)
{
ans[i] = ans[i] * x + g;
g = ans[i] / 10;
ans[i] = ans[i] % 10;
}
while(g)
{
ans[++ans[0]] = g;
g = ans[ans[0]] / 10;
ans[ans[0]] = ans[ans[0]] % 10;
}
} int main()
{
scanf("%d" , &n);
for(register int i = 1; i <= n; i++) scanf("%d" , &b[i]);
ans[0] = ans[1] = 1;
for(register int i = 1; i <= n; i++)
{
if (b[i] - b[i-1] == 1) mul(i - b[i-1] + i - 1 - b[i - 1]);
else if (b[i] - b[i-1] == 2) mul((i - b[i - 1] - 1) * (i - b[i - 1] - 1));
}
for(register int i = ans[0]; i; i--) printf("%d" , ans[i]);
}

JZOJ 排列统计的更多相关文章

  1. LA 3641 Leonardo的笔记本 & UVA 11077 排列统计

    LA 3641 Leonardo的笔记本 题目 给出26个大写字母的置换B,问是否存在要给置换A,使得 \(A^2 = B\) 分析 将A分解为几个循环,可以观察经过乘积运算得到\(A^2\)后,循环 ...

  2. 【XSY2668】排列统计 DP

    题目描述 给你一个长度为\(n\)的排列\(a\),每次要选择两个数,交换这两个数(这两个数可以相同).总共要交换\(k\)次. 最后要统计数列中有多少位置\(i\)满足\(\max_{j\leq i ...

  3. 英文词频统计的java实现方法

    需求概要 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 分析 1.读取文件可使用BufferedReader ...

  4. loj 6433 「PKUSC2018」最大前缀和 题解【DP】【枚举】【二进制】【排列组合】

    这是个什么集合DP啊- 想过枚举断点但是不会处理接下来的问题了- 我好菜啊 题目描述 小 C 是一个算法竞赛爱好者,有一天小 C 遇到了一个非常难的问题:求一个序列的最大子段和. 但是小 C 并不会做 ...

  5. Pandas 之 描述性统计案例

    认识 jupyter地址: https://nbviewer.jupyter.org/github/chenjieyouge/jupyter_share/blob/master/share/panda ...

  6. SOS.dll(SOS 调试扩展)

      SecAnnotate.exe(.NET 安全批注器工具) SignTool.exe(签名工具) Sn.exe(强名称工具) SOS.dll(SOS 调试扩展)   SqlMetal.exe(代码 ...

  7. 数据库的CRUD操作

    一:数据库的CRUD操作,C是指create新增,R是指retrieve检索,U是指update更改,D是指delete删除 SQL语句分为3类: 1.DDL指数据定义语言如:create,drop, ...

  8. SRM 406(1-250pt, 1-500pt)

    DIV1 250pt 题意:有几家宠物店,vecort<int>A表示每家宠物店含有小狗占小狗总数的百分比.现在要做扇形统计图统计每家店的小狗百分比,如下图,问作出来的扇形统计图中最多含有 ...

  9. linux学习总结----mongoDB总结

    dbhelper.py 用户登录和注册(加密算法) 加密导包 import hashlib 或者使用Md5 加密 MongoDB ->JSON service mysql start servi ...

  10. [转]软件开发规范—模块开发卷宗(GB8567——88)

    做软件开发是有那么一套国准可参照的,当然就是那些文档了,这里列出一下所有软件开发的规范文档: 操作手册 用户手册 软件质量保证计划 软件需求说明书 概要设计说明书 开发进度月报 测试计划文档 测试分析 ...

随机推荐

  1. Fastjsonfan反序列化(1)

    前言 之前只是对FastJson漏洞有简单的一个认知,虽然由于网上fastjson漏洞调试的文章很多,但是真正有着自己的理解并能清楚的讲述出来的文章少之又少.大多文章都是对已知的漏洞调用流程做了大量分 ...

  2. jjava基础语法

    java基础语法1 注释 注意: SDK要选择JDK1.8,且下面的语言要选择8,配置完这个环境后,JAVA才能正常运行. 单行注释 //+text 快捷键:ctrl+/ 多行注释  /*+text+ ...

  3. Django中ORM多对多三种创建方式(全自动-纯手动-半自动)

    一:多对多三种创建方式 1.全自动: 利用orm自动帮我们创建第三张关系表 class Book(models.Model): name = models.CharField(max_length=3 ...

  4. 如何在路由绑定中使用 IParsable

    IParsable 是 .Net 7 中新增的接口,它可以将字符串转换为对应的实体.在 Controller 的 Route 绑定中可以使用 IParsable 来绑定复杂的实体. 实验背景 假设有一 ...

  5. JavaScript:对象:如何创建对象?

    JS是面向对象的语言,除开基础数据类型,其他所有的数据类型都是对象,包括函数. 如何去理解对象,什么是对象呢? 举个例子,比如我们将日常生活中见到的猫这种动物,抽象成一个类Cat,这里不去谈类是什么概 ...

  6. 【世界杯黑技术专题】「原理探索专题」一文解读一下“卡塔尔世界杯”的先进技术之半自动越位技术SAOT+比赛用球Al Rihla

    盘点卡塔尔世界杯的先进黑科技 归纳总结一下目前世界杯的先进的黑科技有哪些?大致可以划分为以下几点. 半自动化越位技术 比赛用球Al Rihla 球场智能空调 可持续利用的体育场 便利的数字设施和App ...

  7. [深度学习] ncnn安装和调用基础教程

    目录 1 介绍 2 Ubuntu 18下ncnn安装和使用 2.1 Ubuntu 18下ncnn编译安装 2.2 Ubuntu 18下ncnn使用 3 Windows 10下ncnn安装和使用 3.1 ...

  8. python进阶之路15 之异常处理、生成器相关

    异常捕获处理 1.异常 异常就是代码运行报错 行业术语叫bug 代码运行中一旦遇到异常会直接结束整个程序的运行 我们在编写代码的过程中要尽可能避免 2.异常分类 语法错误 不允许出现 一旦出现立刻改正 ...

  9. 蚂蚁感冒【第五届蓝桥杯省赛C++A/B组】

    蚂蚁感冒 长 \(100\) 厘米的细长直杆子上有 \(n\) 只蚂蚁. 它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是 1 厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方 ...

  10. LVGL 中图片使用问题

    此笔记主要是记录在 LVGL 中使用图片的几种方式,以及使用过程中遇到的问题.最近在 ARM linux 中使用 LVGL 时,发现加载图片变得很卡,一开始还好,当连续加载的图片变多后,特别是动画的过 ...