Codeforces 991E. Bus Number (DFS+排列组合)
解题思路
将每个数字出现的次数存在一个数组num[]中(与顺序无关)。
将出现过的数字i从1到num[i]遍历。(i from 0 to 9)
得到要使用的数字次数数组a[]。
对于每一种a使用排列组合公式:

ans += 上面那个公式。(每用一次这个公式对应一个a)
排列组合公式注解
- 减号左边表示的是sum个数字全排列并去重。
- 减号右边表示的是从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+排列组合)的更多相关文章
- Codeforces G. Bus Number(dfs排列)
题目描述: Bus Number time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- Codeforces Gym 100187D D. Holidays 排列组合
D. Holidays Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/D ...
- CodeForces - 817B(分类讨论 + 排列组合)
题目链接 思路如下 这一题是:最菜的队伍只有三个人组成,我们只需对排序后的数组的 前三个元素进行分类讨论即可: a[3] != a[2] && a[3] != ar[1] a[3] = ...
- DFS排列组合问题
这四个使用DFS来求解所有组合和排列的例子很有代表性,这里做一个总结: 1.不带重复元素的子集问题 public ArrayList<ArrayList<Integer>> s ...
- dfs 排列组合——找所有子集(重复元素和不重复元素)
17. 子集 中文 English 给定一个含不同整数的集合,返回其所有的子集. 样例 样例 1: 输入:[0] 输出: [ [], [0] ] 样例 2: 输入:[1,2,3] 输出: [ [3], ...
- codeforces 57 C Array(简单排列组合)
C. Array time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- 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 ...
- DFS实现排列组合
所谓排列,是指从给定的元素序列中依次取出元素,需要考虑取出顺序.比如,取出元素3, 5,因取出顺序的不同,则形成的序列{3, 5}与{5, 3}是不同的排列序列.对于长度为n的元素序列取出k个元素,则 ...
- Codeforces Round #491 (Div. 2) E - Bus Number + 反思
E - Bus Number 最近感觉打CF各种车祸.....感觉要反思一下, 上次读错题,这次想当然地以为18!肯定暴了longlong 而没有去实践, 这个题我看到就感觉是枚举每个数字的个数,但是 ...
随机推荐
- 软件开发的MVC构架
MVC:IDE开发环境开发时,无意中使用的软件结构. 转自于wikipedia:http://zh.wikipedia.org/wiki/MVC 软件的层次划分:框架--组件(设计模式)--算法与数据 ...
- 从ReadImage到ML- 一个不错的博客
实在对不起原作者,为了不把文章淹没在 转载的海洋里.... 原文链接: http://www.cnblogs.com/tornadomeet/archive/2012/09/26/270404 ...
- ZBrush看一个球体如何演变为头发
对于头发的制作,ZBrush®是多样的,前面的教程中也有讲解,可以用球体作为子工具,用不同笔刷进行雕刻:还可以使用Z球转网格的方式.今天小编讲述一种最简单的方法,使用球体演变头发,这样的创作手法更高效 ...
- css3媒介查询使用规则小结
响应式布局可以为不同终端的用户提供更加舒适的界面和更好的用户体验,而且随着目前大屏幕移动设备的普及,用大势所趋来形容也不为过. 用一句话来说:使用同一套Html代码来适配不同设备和满足不同场景不同用户 ...
- node——模块化
之前写的新闻部分几乎所有操作都写在了一起,这次开始进行模块化. 为什么要模块化: 1.提高开发效率,所有操作在一个文件内,不方便团队操作,模块化可多人同时操作 2.当程序出错,可以分模块寻找错误 3. ...
- lsync 负载实现代码双向同步
参考文件: https://www.zyku.net/centos/1713.html 检查错误命令: lsyncd -pidfile /tmp/lsyncd.pid /etc/lsyncd.con ...
- sh脚本文件
echo `date +%F` 打印当前日期 用于写备份脚本按照名字命名
- Project Euler 35 Circular primes
题意:197被称为圆周素数,因为将它逐位旋转所得到的数:197/971和719都是素数.小于100的圆周素数有十三个:2.3.5.7.11.13.17.31.37.71.73.79和97.小于一百万的 ...
- Codeforces 787B Not Afraid( 水 )
链接:传送门 题意:判断 m 组数,如果某一组中出现负数就判断这一组中是否存在与之相反的数,如果每一组中都满足要求则输出 "NO" 反之输出 "YES" 思路: ...
- CentOS 笔记(五) 常用工具
远程 :XShell6 ,PuTTy FPT:Xfpt ,pscp.exe