#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 20;
int n;
bool backup[N], st[N];
int ans;
bool check(int a, int c){
ll b = n * (ll)c - a * c;
if(!a || !b || !c) return false;
memcpy(backup, st, sizeof st);
while(b){
int f = b % 10;
b /= 10;
if(!f || backup[f]) return false;
backup[f] = 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(!st[i]){
st[i] = true;
dfs_c(u + 1, a, c * 10 + i);
st[i] = false;
}
}
}
void dfs_a(int u, int a){//枚举到第u位数,枚举的a是a
if(a >= n) return ;//如果a已经>=n,已经没有b、c的生存空间,不合题意,舍去
dfs_c(u, a, 0);//枚举和这个a值相配的c
for(int i = 1; i <= 9; i ++ ){
if(!st[i]){
st[i] = true;
dfs_a(u + 1, a * 10 + i);
st[i] = false;//恢复现场
}
}
}
//把n拆成n=a + b/c的形式
//对a、c进行深搜,推出b
int main()
{
cin>>n;
dfs_a(0, 0);
cout<<ans<<endl;
return 0;
}
AcWing 1209 带分数 题解 (递推 蓝桥杯)
于 2022-03-13 21:02:25 首次发布