题目大意:
给定一个n,在1 —— 9 中,求符合 n = a + c / b 有多少。a、b、c要求包含1——9且只能出现一次。
解题思路:递推枚举,先从 a 开始枚举 ,然后 c 进行枚举,根据式子 n = a + b / c, 求出b = n * c - a * c (爆 int , 开 long long) ,然后判断a , b , c 中数字是否包含1 — 9 ,且只出现一次。
代码: (借鉴Acwing的y总)#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10;
int n;
int result ;
bool used[N];
bool sta[N];
bool check(int a, int c){
long long b = n *(long long) c - a * c;
if (!a || !b || !c) return false; // 当 a,b,c中存在0时,返回false
memcpy(sta,used,sizeof(used)); // 讲used的值赋给sta 防止影响后面的进行
while(b){
int x = b % 10;
b /= 10;
if (!x || sta[x]) return false;
sta[x] = true;
}
for (int i = 1; i < 10; i++ ){
if (!sta[i]) return false;
}
return true;
}
void dfs_c(int a, int c){
if (check(a,c)) result ++; //如果符合条件 那么 ++
for (int i = 1; i <= 9; i++){
if (!used[i]){
used[i] = true;
dfs_c(a,c*10+i); // c进行增加
used[i] = false; // 恢复现场
}
}
}
void dfs_a(int a){
if (a >= n) return;
if (a) dfs_c (a,0);
for (int i = 1; i <= 9;i++){
if(!used[i]){
used[i] = true;
dfs_a(a*10+i); // a进行增加
used[i] = false; // 恢复现场
}
}
}
int main(){
cin>>n;
dfs_a(0);
cout<< result <<endl;
return 0;
}