题面在这里

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. flask之route中的参数

    flask的路由中有一些参数 使用案例 from flask import Flask, render_template, url_for, session, request, redirect ap ...

  2. python面向对象-多继承区别

    #!/usr/local/bin/python3 # -*- coding:utf-8 -*- ''' 构造方法继承策略: 在python2中,经典类是按照深度优先继承构造方法的:新式类是按照广度优先 ...

  3. MySQL server has gone away报错原因分析及解决办法

    原因1. MySQL 服务宕了 判断是否属于这个原因的方法很简单,执行以下命令,查看mysql的运行时长 $ mysql -uroot -p -e "show global status l ...

  4. uva 540 - Team Queue(插队队列)

    首发:https://mp.csdn.net/mdeditor/80294426 例题5-6 团体队列(Team Queue,UVa540) 有t个团队的人正在排一个长队.每次新来一个人时,如果他有队 ...

  5. STL——vector和list

    vector和list为STL中的顺序容器,顺序容器会依次维护第一个到最后一个元素,在顺序容器上,我们主要的操作就是迭代. 头文件: #include<vector> #include&l ...

  6. shell重温---基础篇(连接数据库)

    前几天分享了shell字符串操作,数组操作等,接下来回归到项目,进行数据库操作.按照一般情况来说,shell连接数据库基本上都是DB使用的,因为需要运行大量的sql啊什么的,所以都会封装到shell中 ...

  7. WPF中的ControlTemplate(控件模板)

    原文:WPF中的ControlTemplate(控件模板) WPF中的ControlTemplate(控件模板)                                             ...

  8. 用ServiceStack操作使用redis的问题

    最近在学习Redis,查阅网上很多资料后使用SericeStack连接redis.在nuget中下载ServiceStack.Redis,主要使用到四个dll 但是运行之后会出现一堆奇怪问题:没有实现 ...

  9. 《python核心编程第二版》第1章练习

    1–1. 安装 Python.请检查 Python 是否已经安装到你的系统上,如果没有,请下载并 安装它 略 1–2.  执行 Python.有多少种运行 Python 的不同方法?你喜欢哪一种?为什 ...

  10. Laravel 5.5 创建全局公共函数

    一.需求 我在使用 Laravel 进行项目逻辑处理的时候要加载一些方法,需要全局调用 这个方法又必须得是一个全局函数,因此需要给 Laravel 创建全局的公共函数 二.实现 1.创建文件 在 ap ...