法一:枚举每个数字
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 15;
int n;
int ans;
bool used[N], backup[N];
bool check(int a, int c)
{
int b = n * c - a * c;
if (!a || !b || !c) return false;
memcpy(backup, used, sizeof used);
while (b)
{
int x = b % 10;
b /= 10;
if (backup[x] || !x) return false;
backup[x] = true;
}
for (int i = 1; i <= 9; i ++ )
if (!backup[i])
return false;
return true;
}
void dfs_c(int u, int a, int c)
{
if (u == n) return;
if (check(a, c)) ans ++ ;
for (int i = 1; i <= 9; i ++ )
if (!used[i])
{
used[i] = true;
dfs_c(u + 1, a, c * 10 + i);
used[i] = false;
}
}
void dfs_a(int u, int a)
{
if (a >= n) return;
dfs_c(u, a, 0);
for (int i = 1; i <= 9; i ++ )
if (!used[i])
{
used[i] = true;
dfs_a(u + 1, a * 10 + i);
used[i] = false;
}
}
int main()
{
cin >> n;
dfs_a(0, 0);
cout << ans << endl;
}
法二:库函数
先枚举全排列,再枚举位数
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int n;
int num[N];
int res;
int cal(int l, int r)
{
int number = 0;
for (int i = l; i <= r; i ++ )
number = number * 10 + num[i];
return number;
}
int main()
{
cin >> n;
for (int i = 0; i < 9; i ++ ) num[i] = i + 1;
do {
for (int i = 0; i < 9; i ++ )
for (int j = i + 1; j < 9; j ++ )
{
int a = cal(0, i);
int b = cal(i + 1, j);
int c = cal(j + 1, 8);
if (!a || !b || !c) continue;
if (a * c + b == c * n) res ++ ;
}
}while (next_permutation(num, num + 9));
cout << res << endl;
return 0;
}