Description

Magic Numbers |
Write a program that finds and displays all pairs ofintegers and
such that:
- neither
nor
have any digits repeated; and
, where N is a given integer;
Input and Output
The input file consist a integer at the beginning indicating the number of testcase followed by a blank line. Each test case consists of one line of input containing N. Twoinput are separated by a blank line.
For each input the output consists of a sequence of zero or more lines each containing /
= N, where
and N are the integers described above. When there are two or more solutions, sort them by increasing numerator values.Two consecutive output set will separated by a blank line.
1 1234567890
1234567890 / 1 = 1234567890 2469135780 / 2 = 1234567890 4938271560 / 4 = 1234567890 6172839450 / 5 = 1234567890 8641975230 / 7 = 1234567890 9876543120 / 8 = 1234567890
题意:求除数和被除数都没有重复的数字,结果为N 的解
思路:首先回溯把所有可能的组成数字储存起来,然后判断去重就行了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <set>
using namespace std;
typedef long long ll;
vector<ll> sum;
char vis[11];
void cal(ll cnt) {
sum.push_back(cnt);
for (ll i = 0; i <= 9; i++) {
if (vis[i] == '1')
continue;
vis[i] = '1';
cal(cnt*10+i);;
vis[i] = '0';
}
}
int check(ll num) {
int tmp[10];
memset(tmp, 0, sizeof(tmp));
while (num) {
int t = num%10;
if (tmp[t])
return 0;
tmp[t] = 1;
num /= 10;
}
return 1;
}
int main() {
for (ll i = 1; i <= 9; i++) {
vis[i] = '1';
cal(i);
vis[i] = '0';
}
int t;
ll n;
scanf("%d", &t);
while (t--) {
scanf("%lld", &n);
set<ll> ans;
for (ll i = 0; i < sum.size(); i++) {
if (sum[i]%n == 0)
if (check(sum[i]/n))
ans.insert(sum[i]/n);
}
set<ll>::iterator it;
for (it = ans.begin(); it != ans.end(); it++) {
ll p = *it;
printf("%lld / %lld = %lld\n", n*p, p, n);
}
if (t)
printf("\n");
}
return 0;
}