题面在这里

description

你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数。

比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等。

现在给定一个数,问在这个数之前有多少个数。(注意这个数不会有前导0).

data range

\[n的长度不超过50,答案不超过2^{63}-1.
\]

solution

题目相当于求将\(n\)按位拆开重组后小于\(n\)的数的个数(包含前导0)

考虑数位\(DP\),当由危险态到达安全态的时候,由于后面的数码我们已经知道,且可以任意取,

是不是用组合数学统计一下就可以了?

假设当前考虑第\(i\)位\(a_i\)并且选出了一个数码\(s\)代替这一位,

且已经知道不包括第\(i\)位的后面部分组成数码的个数,存储在\(t_{0...9}\)中,

那么当前这一位的答案就是$$\sum_{s=0}{a_i-1}\frac{(\sum_{k=0}{9}t[k])!}{\prod_{k=0}^{9}t[k]!}$$

如果你按照这种递推式写代码你会由于爆\(long long\)获得\(60\)分的好成绩

所以答案需要转换一下,由于$$\frac{(\sum_{k=0}{9}t[k])!}{\prod_{k=0}{9}t[k]!}=\prod_{k=0}{9}C_{\sum_{k=s}{9}t[k]}^{t[s]}$$

最后把每一位答案相加即可

具体实现的过程中,根本不需要开动态规划数组

code

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#define RG register
#define il inline
using namespace std;
typedef long long ll;
typedef double dd;
typedef vector<int> VI;
const int N=52;
ll n,a[N],t[10],tot,ans,C[N][N];
il ll calc(int x){
RG ll sum=1,cnt=tot-1;
for(RG int i=0;i<=9;i++)
if(t[i]-(i==x))
sum*=C[cnt][(t[i]-(i==x))],cnt-=(t[i]-(i==x));
return sum;
} int main()
{
RG char ch=0;
C[0][0]=1;
for(RG int i=1;i<=50;i++)
for(RG int j=0;j<=50;j++){
C[i][j]=C[i-1][j];
if(j)C[i][j]+=C[i-1][j-1];
}
while(ch>'9'||ch<'1')ch=getchar();
while(ch<='9'&&ch>='0'){a[++n]=ch-48;t[a[n]]++;tot++;ch=getchar();}
for(RG int i=1;i<=n;tot--,t[a[i]]--,i++)
for(RG int k=0;k<a[i];k++)
if(t[k])ans+=calc(k); printf("%lld\n",ans);
return 0;
}

[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 你有 ...

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

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

随机推荐

  1. hive 从Excel中导入数据

    拿到Excel表后将数据保留,其他的乱七八糟都删掉,然后另存为txt格式的文本,用nodepad++将文本转换为UTF-8编码,此处命名为cityprovince.txt 将cityprovince. ...

  2. Python学习手册之Python异常和文件

    在上一篇文章中,我们介绍了 Python 的函数和模块,现在我们介绍 Python 中的异常和文件. 查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9963 ...

  3. Drupal 网站漏洞修复以及网站安全防护加固方法

    drupal是目前网站系统使用较多一个开源PHP管理系统,架构使用的是php环境+mysql数据库的环境配置,drupal的代码开发较为严谨,安全性较高,但是再安全的网站系统,也会出现网站漏洞,dru ...

  4. Windows10 快捷键

    windows 10快捷键: F1 打开帮助 F2 重命名 F3 打开搜索文件和文件夹 F4 打开地址栏常用的地址 F5 刷新 F11   全屏 选择文件和内容: shift + 上下左右键选择连续的 ...

  5. spring配置jackson不返回null值

    #json不返回null spring.jackson.default-property-inclusion=non_null

  6. 20145202马超 2016-2017-2 《Java程序设计》第一次实验

    之前做的(http://www.cnblogs.com/tuolemi/p/5707098.html) 其余的 断点的使用 行断点 条件断点 参考(http://www.cnblogs.com/roc ...

  7. Phoenix映射HBase数据表

    1. 说明 安装好phoenix后对于HBase中已经存在的数据表不会自动进行映射,所以想要再phoenix中操作HBase已有数据表就需要手动进行配置. 2. 创建HBase表 > creat ...

  8. luogu2387 [NOI2014]魔法森林

    这题和水管局长很像,枚举 \(a\) 的边然后维护关于 \(b\) 的最小生成树就可以了. 1A呐>_< #include <algorithm> #include <i ...

  9. css匹配规则及性能

    一.CSS是如何匹配样式的 样式系统从最右边的选择符开始向左进行匹配规则.只要当前选择符的左边还有其他选择符,样式系统就会继续向左移动,直到找到和规则匹配的元素,或者因为不匹配而退出. 二.CSS选择 ...

  10. VS2010使用NuGet程序包管理器

    使用C#过程中经常需要使用一些扩展包,例如sqlite,json解析等. VS2010自带了一个扩展管理器,里面可以下载到AStyle,Visual Assit等有用的插件. VS2010中点击[工具 ...