问题描述
思路
看到这一题我首先想到的是枚举0~9的全排列,此时枚举量是10!。但实际上只需枚举fghij就可以了,可以利用set的特性向set中不断的插入,最后判断就可以了。
具体代码
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <unordered_map>
#include <map>
#include <set>
using namespace std;
#define mcpy(b, a) memcpy(b, a, sizeof a)
#define mset(a) memset(a, 0, sizeof a)
#define pb push_back
#define fi first
#define se second
#define mp make_pair
typedef long long LL;
typedef pair<int, int> PII;
set<int> s;
int check(int a, int b) {
if (b > 98765) return 0;
s.clear();
if (a < 10000) s.insert (0);
while (a) {
s.insert (a % 10);
a /= 10;
}
if (s.size() != 5) return 0;
while (b) {
s.insert (b % 10);
b /= 10;
}
return (s.size() == 10);
}
int main() {
int n, T = 0;
while (scanf("%d", &n) != EOF && n) {
if (T ++ ) printf("\n");
int cnt = 0;
for (int i = 1234; i < 100000; i ++ ) {
if (check(i, i * n)) {
printf("%05d / %05d = %d\n", i * n, i, n);
cnt ++;
}
}
if (!cnt)
printf("There are no solutions for %d.\n",n);
}
return 0;
}