题目大意

给出一个数字$n$,求满足下列条件的数$x$的个数:

  1. $x<n$
  2. 对于来自于$x$十进制各个数位上的非零数字,它们的种类与个数都与$n$的相同。

思路

入手点

  设$n$有$t$位数字,如果满足上述条件的$x$的位数$t'$比$t$小,那相当于$x$前面含有$t-t'$个前缀0!因此如果我们不考虑第1条,那么$x$就是由$n$各个位上数字包括0组成的全排列。

考虑第一条

  我们定义$a_i$为数$n$在第$i$位上的数字,$b_i$则是$x$的。$f(m)$为当$n$与$x$在$m$以上的位数都相等的情况下,满足题目条件的排列个数。若$a_m=b_m$,则转化为子问题$f(m-1)$;如果$b_m<a_m$,则$x$位数比$m$小的那部分无论如何排列,都会满足第一条,故结果为:对于每一个$b_m\in[0,a_m)$,将其锁定在第$m$位,$n$在$m$及以下的位数的所有数字排除掉被安在第一位的$b_m$后,在$m-1$个数中的全排列。由加法原理,这些结果都要相加。

怎么求含可重元素的全排列

  已知一个数组,$h_i$表示一个元素的个数,在长度$m$的区间里求它的全排列。其相当于先在区间中安0,共有$C_m^{h_0}$种选法;然后再在剩余的空间$m-h_0$中看看1的安放方式,即$C_{m-h_0}^{h_1}$。以此类推。根据乘法原理,这些组合数要相乘才为结果。

注意事项

  • ans用long long!
  • 求组合数递归时不要忘了给C数组赋值!
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <cstdlib>
#include <iostream>
using namespace std; #define ll long long
const int MAX_DIGIT = 55, MAX_NUM = 10;
ll A[MAX_DIGIT];
int NumCnt[MAX_NUM];
ll C[MAX_DIGIT][MAX_DIGIT]; ll Comb(int n, int m)
{
if (n < 0 || m < 0)
return 0;
if (C[n][m])
return C[n][m];
else if (m == 0 || m == n)
return C[n][m] = 1;
else if (m == 1)
return C[n][m] = n;
else if (m > n)
return 0;
else
return C[n][m] = Comb(n - 1, m - 1) + Comb(n - 1, m);
} ll GetAns(const int len)
{
if (len == 1)
return 0;
ll ans = 0;
for (int firstNum = 0; firstNum < A[len]; firstNum++)
{
NumCnt[firstNum]--;
int subLen = len - 1;
ll combAns = 1;
for (int num = 0; num < 10; num++)
{
combAns *= Comb(subLen, NumCnt[num]);
subLen -= NumCnt[num];
}
NumCnt[firstNum]++;
ans += combAns;
}
NumCnt[A[len]]--;
ans += GetAns(len - 1);
return ans;
} int main()
{
stack<int> st;
char c;
while (cin >> c && isdigit(c))
st.push(c - '0');
int len = 0;
while (!st.empty())
{
A[++len] = st.top();
NumCnt[A[len]]++;
st.pop();
}
cout << GetAns(len) << endl;
return 0;
}

  

luogu2518 [HAOI2010] 计数的更多相关文章

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

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

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

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

  3. BZOJ2425: [HAOI2010]计数

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

  4. P2518 [HAOI2010]计数

    题目链接 \(Click\) \(Here\) 很好很妙的一个题目. 其实可以生成的数字,一定是原数的一个排列,因为\(0\)被放在前面就可以认为不存在了嘛~.也就是说现在求的就是全排列中所有小于该数 ...

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

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

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

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

  7. [HAOI2010]计数(组合数学)(数位DP)

    原题题意也就是给的数的全排列小于原数的个数. 我们可以很容易的想到重复元素的排列个数的公式. 但是我们发现阶乘的话很快就会爆long long啊(如果您想写高精请便) 之后我就尝试质因数分解....但 ...

  8. [HAOI2010]计数 数位DP+组合数

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

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

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

随机推荐

  1. org.apache.catalina.core.StandardContext startInternal SEVERE: Error listenerStart

    问题:文件明明存在,资源找不到,报错 解决方法:原因是没有build path,这有点像.net里边的build .点击相应的文件夹选择build path ,解决问题

  2. JDBC的详细使用

    1.首先说一下需要用到的工具: ①我这里用的数据库是MySql5.6 ,MySql6.0开始被Oracle收购需要付费了,6.0以下版本免费. ②去Maven仓库下载JDBC的jar包 Maven仓库 ...

  3. H265

    H265 h265  一.名词 CTU: 编码树单元 CU: 编码单元 PU: 以CU为根,对CU进行划分,一个预测单元PU包含一个亮度预测块PB和两个色度预测块PB. TU: 以CU为根,变换单元T ...

  4. 【Oracle】redo与undo

    一 .redo(重做信息) 是Oracle在线(或归档)重做日志文件中记录的信息,万一出现失败时可以利用这些数据来“重放”(或重做)事务.Oracle中记录这些信息的文件叫做redo log file ...

  5. 【Oracle】RedHat 6.5 安装 11gR2数据库

    1. 挂载操作系统光盘 [root@drz ~]# mount /dev/cdrom /mnt mount: block device /dev/sr0 is write-protected, mou ...

  6. WCF分佈式事務支持

    WCF分佈式事務對Binding有要求,不支持BasicHttpBinding,BasicHttpContextBinding,NetPeerTcpBinding 要支持分佈式事務,需要進行以下配置: ...

  7. 实验8 标准模板库STL

    一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...

  8. c# md5加密封装

    /// <summary> /// md5加密字符串 /// </summary> /// <param name="str">需要加密的字符串 ...

  9. Hbuider sass配置 webstorm scss配置

    --no-cache %FileName% ../css/%FileBaseName%.css   sass编译后保存到css目录下 webstorm scss配置 C:\Ruby22-x64\bin ...

  10. swift-自动计算字符串的宽高

    写一个方法来继承String //自动控制文字换行及宽度 extension String { func textSizeWithFont(font: UIFont, constrainedToSiz ...