P2518 [HAOI2010]计数
题目链接 \(Click\) \(Here\)
很好很妙的一个题目。
其实可以生成的数字,一定是原数的一个排列,因为\(0\)被放在前面就可以认为不存在了嘛~。也就是说现在求的就是全排列中所有小于该数的排列。对每一位我们考虑两类情况:
- 第一类情况 : 前 \(i\) 位上均相等, 且第 \(i\) 位上当前数是 \(j\) (比 \(arr_i\) 小)
- 这一位已经满足了约束条件小于,那么后面就可以放开了搞。也就是说后\(n-i\)个数形成的全排列中,每一个排列都是可以使用的,即答案加上一个全排列。
- 为了避免高精度计算,这里使用了比较特殊的方法计算可重集的全排列。
- 第二类情况 : 当前位置依然相等。
- 对此我们要在桶里去掉和这一位相等的数字,然后就可以去进行下一位计算啦。
最后让我们来一起复习一下差点把我卡死的可重集排列数公式吧\(QwQ\):
\]
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 55;
int C[N][N];
int ch, n, ans, tot[10], arr[100];
int get_ans (int n) {
int res = 1;
for (int i = 0; i <= 9; ++i) {
if (tot[i] != 0) {
res *= C [n][tot[i]];
n -= tot[i];
}
}
return res;
}
signed main () {
C[0][0] = 1;
for (int i = 1; i <= 50; ++i) {
for (int j = 0; j <= 50; ++j) {
C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
}
}
while (true) {
if (isdigit (ch = getchar ())) {
arr[++n] = ch - '0';
tot[arr[n]]++;
} else break;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < arr[i]; j++) {
if (tot[j] != 0) {
//第一类情况 : 前 i 位上均相等, 且第 i 位上当前数是 j (比 arr[i] 小)
tot[j] = tot[j] - 1;
ans += get_ans (n - i);
tot[j] = tot[j] + 1;
//选中当前数 j, 对剩下的数求全排列 (可以随便选择了)
}
}
//第二类情况 : 当前位置依然相等, 去掉相等的数字, 进行下一位计算
tot[arr[i]]--;
}
cout << ans << endl;
}
P2518 [HAOI2010]计数的更多相关文章
- 洛谷 P2518 [HAOI2010]计数 (组合数)
题面 luogu 题解 本来想练数位dp的,结果又忍不住写了组合数.. 去掉一个\(0\)可以看作把\(0\)移到前面去 那么题目转化为 \(n\)有多少个排列小于\(n\) 强制某一位比\(n\)的 ...
- 洛谷P2518 [HAOI2010]计数
题目描述 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. ...
- P2518 [HAOI2010]计数 类似数位dp
题意 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. 现 ...
- 【BZOJ2425】[HAOI2010]计数(组合数学)
[BZOJ2425][HAOI2010]计数(组合数学) 题面 BZOJ 洛谷 题解 很容易的一道题目. 统计一下每个数位出现的次数,然后从前往后依次枚举每一位,表示前面都已经卡在了范围内,从这一位开 ...
- bzoj 2425 [HAOI2010]计数 dp+组合计数
[HAOI2010]计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 451 Solved: 289[Submit][Status][Discus ...
- BZOJ2425: [HAOI2010]计数
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2425 其实能够构成的数就是原数的排列(算前导0),然后组合计数一下就可以了. #include ...
- BZOJ2425:[HAOI2010]计数——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2425 https://www.luogu.org/problemnew/show/P2518 你有 ...
- bzoj千题计划178:bzoj2425: [HAOI2010]计数
http://www.lydsy.com/JudgeOnline/problem.php?id=2425 题意转化: 给定一个集合S,求S的全排列<给定排列 的排列个数 从最高位开始逐位枚举确定 ...
- BZOJ2425:[HAOI2010]计数(数位DP)
Description 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1 ...
随机推荐
- 【记录】IntelliJ IDEA—IDEA2018-2019激活
摘要 最智能的java ide [有能力请支持正版] 1.将 0.0.0.0 account.jetbrains.com 和 0.0.0.0 www.jetbrains.com添加到 host ...
- python文件上传
1.前端代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- MySQL 数据查询
SELECT子句:用来指定查询返回字段,星号(*)表示返回所有字段 SELECT [DISTINCT]*|字段列表 #DISTINCT 用来过滤重复数据 FROM子句:用来指定数据来源 ...
- Python开发【第三篇】基本数据类型
整型 int __author__ = 'Tang' # 将字符串转换为数字 a = " b = int(a) # 前面是0的数转换,默认base按照十进制 a = " b = i ...
- SQL解析在美团的应用
https://tech.meituan.com/SQL_parser_used_in_mtdp.html 数据库作为核心的基础组件,是需要重点保护的对象.任何一个线上的不慎操作,都有可能给数据库带来 ...
- websocket 实现单聊群聊 以及 握手原理+加密方式
WebSocket 开始代码 服务端 群聊 # type:WebSocket 给变量标注类型 # websocket web + socket from geventwebsocket.server ...
- MySQL之库相关操作
一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...
- Linux查询进程和结束进程
1. ps -ef |grep redis ps:将某个进程显示出来-A 显示所有程序. -e 此参数的效果和指定"A"参数相同.-f 显示UID,PPIP,C与STIME栏位. ...
- 前端——JavaScript
何谓JavaScript?它与Java有什么关系? JavaScript与HTML.CSS组合使用应用于前端开发,JavaScript是一门独立的语言,浏览器内置了JS的解释器.它除了和Java名字长 ...
- 搭建vue.js环境
一.安装Node.js (以下安装环境均为win10) 下载链接:https://nodejs.org/en/download/ 官网给出了两个版本,LTS和Curren.字面意思是推荐大多数用户使用 ...