题目链接 \(Click\) \(Here\)

很好很妙的一个题目。

其实可以生成的数字,一定是原数的一个排列,因为\(0\)被放在前面就可以认为不存在了嘛~。也就是说现在求的就是全排列中所有小于该数的排列。对每一位我们考虑两类情况:

  • 第一类情况 : 前 \(i\) 位上均相等, 且第 \(i\) 位上当前数是 \(j\) (比 \(arr_i\) 小)

    • 这一位已经满足了约束条件小于,那么后面就可以放开了搞。也就是说后\(n-i\)个数形成的全排列中,每一个排列都是可以使用的,即答案加上一个全排列。
    • 为了避免高精度计算,这里使用了比较特殊的方法计算可重集的全排列。
  • 第二类情况 : 当前位置依然相等。
    • 对此我们要在桶里去掉和这一位相等的数字,然后就可以去进行下一位计算啦。

最后让我们来一起复习一下差点把我卡死的可重集排列数公式吧\(QwQ\):

\[(a[0]+a[1]+...+a[9])!/a[0]!/a[1]!/.../a[9]!
\]

#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]计数的更多相关文章

  1. 洛谷 P2518 [HAOI2010]计数 (组合数)

    题面 luogu 题解 本来想练数位dp的,结果又忍不住写了组合数.. 去掉一个\(0\)可以看作把\(0\)移到前面去 那么题目转化为 \(n\)有多少个排列小于\(n\) 强制某一位比\(n\)的 ...

  2. 洛谷P2518 [HAOI2010]计数

    题目描述 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. ...

  3. P2518 [HAOI2010]计数 类似数位dp

    题意 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. 现 ...

  4. 【BZOJ2425】[HAOI2010]计数(组合数学)

    [BZOJ2425][HAOI2010]计数(组合数学) 题面 BZOJ 洛谷 题解 很容易的一道题目. 统计一下每个数位出现的次数,然后从前往后依次枚举每一位,表示前面都已经卡在了范围内,从这一位开 ...

  5. bzoj 2425 [HAOI2010]计数 dp+组合计数

    [HAOI2010]计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 451  Solved: 289[Submit][Status][Discus ...

  6. BZOJ2425: [HAOI2010]计数

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2425 其实能够构成的数就是原数的排列(算前导0),然后组合计数一下就可以了. #include ...

  7. BZOJ2425:[HAOI2010]计数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2425 https://www.luogu.org/problemnew/show/P2518 你有 ...

  8. bzoj千题计划178:bzoj2425: [HAOI2010]计数

    http://www.lydsy.com/JudgeOnline/problem.php?id=2425 题意转化: 给定一个集合S,求S的全排列<给定排列 的排列个数 从最高位开始逐位枚举确定 ...

  9. BZOJ2425:[HAOI2010]计数(数位DP)

    Description 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1 ...

随机推荐

  1. 初级c++编码规范

        想了很久,第一篇文章还是应该写编码规范好一点.编码规范是一个仁者见仁的问题,为了避免复杂庞大,自己总结了一套简单版本的规范. 简介     本文介绍一份自己使用的C++编码规范.第一次正式进入 ...

  2. 无法确定条件表达式的类型,因为“<null>”和“System.DateTime”之间没有隐式转换----解决办法

    例子:(报错了) public DateTime? time { get; set; } time = item.HospOutDate.HasValue ? DateTime.Parse(item. ...

  3. go语言打造个人博客系统(二)

    go语言打造个人博客系统(二)   在上篇文章go语言打造个人博客系统(一)中,我们了解了go语言的优点和go语言的数据库操作,本次我们会完成博客系统的后端开发. 博客系统后端接口开发 路由测试 ht ...

  4. Nginx+uWSGI启动Django

    在之前的几篇博客中对Django的功能做了初步实践,这里链接贴一下: Django的安装和启动 Django之--网页展示Hello World! Django之--通过MVC架构的html模板展示H ...

  5. Bootstrap -- 缩略图、进度条、列表组、面板

    Bootstrap -- 缩略图.进度条.列表组.面板 1. 缩略图 大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap ...

  6. python selenium2 中的显示等待WebDriverWait与条件判断expected_conditions举例

    #coding=utf-8from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium. ...

  7. sqlmap --tamper 绕过WAF脚本分类整理

    分类: https://blog.csdn.net/whatday/article/details/54774043 详细介绍: https://blog.csdn.net/qq_34444097/a ...

  8. 黏包现象之TCP

    老师的博客:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label5 server #_*_coding:gbk*_ from socket ...

  9. JS检测浏览器是否最大化

    function isFullScreen (){     if(         window.outerHeight === screen.availHeight     ){         i ...

  10. Redis数据结构之简单动态字符串SDS

    Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...