T4 独特数
内存限制: 256 Mb 时间限制: 1000 ms
题目描述
如果一个正整数的十进制表示中,每一位数字都不同,则称它为独特数。将所有独特数从小到大排列,给定 n,请求出第 n 小的独特数。
输入格式
单个整数:表示 n。
输出格式
单个整数:表示第 n 个独特数。
数据范围
- 对于 50% 的数据,1 ≤ n ≤ 1000
- 对于 100% 的数据,1 ≤ n ≤ 4,000,000
(十进制的独特数共有 5611761 个)
样例数据
90分代码(有一个测试点超时):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool vis[10];
int a[10] = {9, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int main() {
int n, cnt = 0;
cin >> n;
int ws = 1;
ll sum = 0, jia = 9;
while (sum + jia < n) {
sum += jia;
ws++;
jia = 1;
for (int i = 0; i < ws; i++) {
jia *= a[i];
}
}
// cout<<"begin:"<<pow(10,ws-1)<<endl;
cnt = sum;
// cout<<cnt<<endl;
for (int i = pow(10, ws - 1);; i++) {
bool f = 1;
memset(vis, 0, sizeof(vis));
for (int j = i; j; j /= 10) {
if (vis[j % 10]) {
f = 0;
break;
}
vis[j % 10] = 1;
}
if (f == 0)
continue;
cnt++;
if (cnt == n) {
cout << i;
return 0;
}
}
return 0;
}