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 而没有去实践, 这个题我看到就感觉是枚举每个数字的个数,但是 ...
随机推荐
- CUDA5.5入门文章:VS10设置
原文链接:http://blog.csdn.net/augusdi/article/details/12205435 作者专栏:http://blog.csdn.net/augusdi/article ...
- 3D集合图元:最小边界框/包围盒(boundingbox)
对于2D边界框的应用时比较广泛地,它为一个简单匹配建立了很小的计算规则,3D模型的boundingbox则比较困难,计算代价较大.对于PCL库的使用则降低了计算难度,三维数值化降低了建模过程,可以使用 ...
- UVa1585修改版
#include<stdio.h> int main() { int i,k=-1; char a[100]; while(scanf("%s",&a)!=EO ...
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--MVC控制器的设计
http://www.cnblogs.com/wuhuacong/p/3284628.html 自从上篇<基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍>总体性的概括,得到 ...
- 是时候学习 RxSwift 了
相信在过去的一段时间里,对 RxSwift 多少有过接触或耳闻,或者已经积累了不少实战经验.此文主要针对那些在门口徘徊,想进又拍踩坑的同学. 为什么要学习 RxSwift 当决定做一件事情时,至少要知 ...
- Java中数组的反转
public class ArrayDemo2 { public static void main(String[] args) { //定义一个数组存放元素 int[] arr3 = {10, 20 ...
- Ubuntu Server 18.04 LTS 安装
版本:Ubuntu Server 18.04.1 LTS 环境:VMware Workstation 14 Player 下载地址:https://www.ubuntu.com/download/se ...
- 团体程序设计天梯赛-练习集-L1-029. 是不是太胖了
L1-029. 是不是太胖了 据说一个人的标准体重应该是其身高(单位:厘米)减去100.再乘以0.9所得到的公斤数.已知市斤是公斤的两倍.现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自 ...
- js操作table中tr的顺序,实现上移下移一行的效果
总体思路是在table外部加个div,修改div的innerHtml实现改变tr顺序的效果 具体思路是 获取当前要移动tr行的rowIndex,在table中删除掉,然后循环table的rows,到了 ...
- luogu 4884 多少个1 (BSGS)
很有意思的一个签到题 然而考场上并没有切掉 $1111...111=K(mod\;m)$ $10^{x}=9K+1(mod\;m)$ 用$BSGS$求解即可 模数爆了$int$,需要快速乘,然而模数是 ...