列表

详情


NC229276. Bus Number

描述

这个夜晚对牛牛来说并不容易。他最喜欢的球队输了,他也没有发现自己赢了——尽管他打得很好,但他的队友每次都让他失望。他至少得再赢一次,但连败的时间却越来越长……难怪他今晚一夜没睡。

早上,牛牛在公交车站等着去大学的公交车。牛牛思绪一片朦胧,记不清正确的车号,于是上了号车。

在公交车上,牛牛觉得他可能把公交车编号的数字顺序弄错了。而且,他可以“看到”几个数字,但他看到的数字绝对是公交车编号的真实数字。例如,如果牛牛看到数字 2028,则可能意味着实际的公交车编号可能是 2028、8022、2820 或只是 820。但是,数字 80、22208、52 绝对不可能是公交车编号。另外,实际公交车编号不能以数字0开头,这意味着,例如,数字082也不能是实际公交车编号。

给定,确定可能的公交车编号的数量。

输入描述

第一行包含一个整数,表示牛牛看到的公交车编号。
保证这个数字不以0开头。

输出描述

输出一个整数表示答案。

示例1

输入:

97

输出:

2

说明:

只可能是97和79

示例2

输入:

2028

输出:

13

说明:

可能的公交车编号(按升序)如下:208、280、802、820、2028、2082、2208、2280、2802、2820、8022、8202、8220。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 7ms, 内存消耗: 472K, 提交时间: 2021-10-14 22:08:12

#include<bits/stdc++.h>
using namespace std;
long long n, ans, fac[19], su, uc = 1, f;
int a[10];
vector<int>v;
void dfs(int x) {
	if (x == v.size())
		ans += fac[su - 1] * (su - f) / uc;
	else
		for (int i = 1; i <= a[v[x]]; i++) {
			if (!v[x])
				f = i;
			su += i, uc *= fac[i], dfs(x + 1), uc /= fac[i], su -= i;
		}
}
signed main() {
	fac[0] = 1;
	for (int i = 1; i < 19; i++)
		fac[i] = fac[i - 1] * i;
	cin >> n;
	while (n)
		a[n % 10]++, n /= 10;
	for (int i = 0; i < 10; i++)
		if (a[i])
			v.push_back(i);
	dfs(0);
	cout << ans;
}

上一题