AcWing 1209. 带分数
原题链接
简单
作者:
XXXJESSIE
,
2024-11-13 12:06:41
,
所有人可见
,
阅读 2
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 30;
bool st[N], backup[N]; // st保证原样,backup用来修改
int ans;
int n;
bool check(int a, int c) {
// 如果 a 为 0,直接返回 false
if (!a) return false;
int b = (n - a) * c; // 修正公式
if (b <= 0) return false; // b 应该大于零才是有效的
// 逐位检查 b 的数字
memcpy(backup, st, sizeof st);
while (b) {
int x = b % 10; // 取个位
b /= 10; // 删个位
if (!x || backup[x]) return false; // 不能有重复或 0
backup[x] = true;
}
// 检查所有数字 1~9 是否都有
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 (!st[i]) {
st[i] = true;
dfs_c(u + 1, a, c * 10 + i); // 修正 c 的传递
st[i] = false;
}
}
}
void dfs_a(int u, int a) {
if (a >= n) return;
if (a) dfs_c(u, a, 0); // 传递给 dfs_c
for (int i = 1; i <= 9; i++) {
if (!st[i]) {
st[i] = true;
dfs_a(u + 1, a * 10 + i); // 递归选择数字
st[i] = false;
}
}
}
int main() {
cin >> n;
dfs_a(0, 0); // 当前已经用了多少数字
cout << ans << endl;
return 0;
}