排列统计

\(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. 【离线数仓】Day03-系统业务数据仓库:数仓表概念、搭建、数据导入、数据可视化、Azkaban全调度、拉链表的使用

    一.电商业务与数据结构简介 1.业务流程 2.常识:SKU/SPU SKU=Stock Keeping Unit(库存量基本单位).现在已经被引申为产品统一编号的简称,每种产品均对应有唯一的SKU号. ...

  2. 1.5.5 HDFS读写解析-hadoop-最全最完整的保姆级的java大数据学习资料

    目录 1.5.5 HDFS读写解析 1.5.5.1 HDFS读数据流程 1.5.5.2 HDFS写数据流程 1.5.5 HDFS读写解析 1.5.5.1 HDFS读数据流程 客户端通过Distribu ...

  3. Flaks框架(Flask请求响应,session,闪现,请求扩展,中间件,蓝图)

    目录 一:Flask请求响应 1.请求相关信息 2.flask新手四件套 3.响应相关信息(响应response增加数据返回) 二:session 1.session与cookie简介 2.在使用se ...

  4. Django框架模板语法传值-过滤器-标签-自定义过滤器,标签,inclusion_tag

    目录 一:模版语法传值 1.模板语法两个书写方式 2.模板语法 3.测试模板语法是否可以把python支持的基本数据类型传入到前端 4.index.html 5.django模板语法取值方式 二:过滤 ...

  5. jQuery基本使用

    目录 一:jQuery查找标签 1.基本选择器 二:分组与嵌套 三:组合选择器 四:jQuery基本筛选器 五:属性选择器 1.属性标签 六:JQuery表单筛选器 1.type属性 2.表单对象属性 ...

  6. Django 连接各数据库配置汇总(sqlite3,MySql,Oracle)

    在django中,默认配置的数据库是 sqlite3 # Database # https://docs.djangoproject.com/en/2.0/ref/settings/#database ...

  7. week_10

    Andrew Ng 机器学习笔记 ---By Orangestar Week_10 (大数据处理) 1. Learning With Large Datasets 机器学习很多时候都要处理非常多的数据 ...

  8. JDBC基础学习笔记

    JDBC的理解: JDBC是允许便捷式访问底层数据库的应用程序接口,JDO.Hibernate.MyBatis等只是更好的封装了JDBC. JDBC的连接步骤: 1.注册驱动: //反射机制 Clas ...

  9. vue3学习第一天

    第一章 Options API与Composition API 重写双向绑定 vue2 基于Object.defineProperty()实现 vue3 基于Proxy proxy与Object.de ...

  10. 解决angular11打包报错Type 'Event' is missing the following properties from type 'any[]': ...Type 'Event' is not assignable to type 'string'

    出现这种情况,需要检查一下以下事项 1.ts类型声明和html里写的是否一致 1.1举例如下,子组件代码需要注意事项,子组件调用父组件方法,点击传参给父组件,在父组件触发一些时间,当前this指向是父 ...