解题思路

  1. 将每个数字出现的次数存在一个数组num[]中(与顺序无关)。

  2. 将出现过的数字i从1到num[i]遍历。(i from 0 to 9)

  3. 得到要使用的数字次数数组a[]。

  4. 对于每一种a使用排列组合公式:

  5. ans += 上面那个公式。(每用一次这个公式对应一个a)

排列组合公式注解

  1. 减号左边表示的是sum个数字全排列并去重。
  2. 减号右边表示的是从a[0]中选出一个0当做第一个数字,并对其他数字全排列并去重。

抱歉,写的可能比较混乱,还有部分细节需要读者处理。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; string s;
int num[10];
ll jc[20];//阶乘
int tempNum[10];
ll ans = 0; void dfs(int x){
//如果0~9都填充好了数字
if(x == 10){
//cnt表示所有数字的个数
int cnt = 0;
for(int i = 0;i < 10; ++i){
cnt += tempNum[i];
}
//排列组合公式 开始
ll p = jc[cnt];
for(int i = 0;i < 10; ++i){
p /= jc[tempNum[i]];
}
if(tempNum[0] >= 1)
p -= (p*tempNum[0]/cnt);
//排列组合公式 结束
ans += p;
return ;
}
//对于出现过的数字,个数从1开始
for(int i = 1;i <= num[x]; ++i){
tempNum[x] = i;
dfs(x+1);
}
if(num[x] == 0){
dfs(x+1);
}
} int main(){
ios::sync_with_stdio(false);
cin >> s;
for(auto i:s) num[i-'0']++;
//算阶乘
jc[0] = 1;
for(ll i = 1;i <= 19; ++i){
jc[i] = jc[i-1]*i;
}
dfs(0);
cout << ans << endl;
return 0;
}

Codeforces 991E. Bus Number (DFS+排列组合)的更多相关文章

  1. Codeforces G. Bus Number(dfs排列)

    题目描述: Bus Number time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  2. Codeforces Gym 100187D D. Holidays 排列组合

    D. Holidays Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/D ...

  3. CodeForces - 817B(分类讨论 + 排列组合)

    题目链接 思路如下 这一题是:最菜的队伍只有三个人组成,我们只需对排序后的数组的 前三个元素进行分类讨论即可: a[3] != a[2] && a[3] != ar[1] a[3] = ...

  4. DFS排列组合问题

    这四个使用DFS来求解所有组合和排列的例子很有代表性,这里做一个总结: 1.不带重复元素的子集问题 public ArrayList<ArrayList<Integer>> s ...

  5. dfs 排列组合——找所有子集(重复元素和不重复元素)

    17. 子集 中文 English 给定一个含不同整数的集合,返回其所有的子集. 样例 样例 1: 输入:[0] 输出: [ [], [0] ] 样例 2: 输入:[1,2,3] 输出: [ [3], ...

  6. codeforces 57 C Array(简单排列组合)

    C. Array time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  7. Codeforces Round #309 (Div. 2) C. Kyoya and Colored Balls 排列组合

    C. Kyoya and Colored Balls Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...

  8. DFS实现排列组合

    所谓排列,是指从给定的元素序列中依次取出元素,需要考虑取出顺序.比如,取出元素3, 5,因取出顺序的不同,则形成的序列{3, 5}与{5, 3}是不同的排列序列.对于长度为n的元素序列取出k个元素,则 ...

  9. Codeforces Round #491 (Div. 2) E - Bus Number + 反思

    E - Bus Number 最近感觉打CF各种车祸.....感觉要反思一下, 上次读错题,这次想当然地以为18!肯定暴了longlong 而没有去实践, 这个题我看到就感觉是枚举每个数字的个数,但是 ...

随机推荐

  1. DataGridview绑定复杂对象

    假设有一个类 class Person { private string id; private string name; private Address homeAddr; public strin ...

  2. Win7系统下调整硬盘分区大小给C盘更多的空间

    电脑安装了很多程序,C盘空间越来越小了.如何给C盘调整更多的空间,其实只要调整硬盘分区大小便可解决这个问题,下面有个小技巧,需要的朋友照做就可以了 Win7系统下如何调整硬盘分区大小,以前装系统的时候 ...

  3. JDBCUtils 工具类

    import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource;import java.io.IOE ...

  4. 一文带您了解5G的价值与应用

    一文带您了解5G的价值与应用 5G最有趣的一点是:大多数产品都是先有明确应用场景而后千呼万唤始出来.而5G则不同,即将到来的5G不仅再一次印证了科学技术是第一生产力还给不少用户带来了迷茫——我们为什么 ...

  5. JS中增加日期格式化原型函数之prototype

    /** * javascript Date format(js日期格式化) * 对Date的扩展,将 Date 转化为指定格式的String 月(M).日(d).小时(h).分(m).秒(s).季度( ...

  6. XSS Chanllenges 6-10

    Stage #6 测试代码</xss> 存在过滤,并且也没有其他输入点,尝试构建" onmousemove="alert(document.domain),并查看源代码 ...

  7. CentOS 笔记(二) 端口占用,进程查看

    ①查看当前端口情况 netstat -nultp ②查看当前进程情况 ps -ef ps -ef|grep dotnet ③强制kill 进程 kill -9 [PIN]

  8. CentOS6.8安装

        VMware下CentOS 6.8安装配置 简述 Linux的安装方法有很多种,下面,我们主要以镜像安装为例,介绍CentOS的安装过程及相关的参数设置,详细步骤如下. CentOS安装配置 ...

  9. https://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflection

    https://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflectio ...

  10. 【推荐】你必须知道的EF知识和经验

    阅读目录   推荐MiniProfiler插件 数据准备 foreach循环的陷进 AutoMapper工具 联表查询统计 性能提升之AsNonUnicode 性能提升之AsNoTracking 多字 ...