AcWing 1209. 带分数
原题链接
简单
作者:
xwx_9
,
2024-03-30 00:08:31
,
所有人可见
,
阅读 2
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10;
int n;
int st[N],backup[N];//st数组记录1~9数字使用状态 backup数组用于check函数保存st数组以便回溯
int ans; //保存结果
bool check(int a,int c){//传入a,c 判断b 枚举b的每一位
//c可能有8位数,那么n*c就会溢出 b可能变成负的 那么backup[x]的下标就可能就越界
long long int b=n*(long long)c-a*c;
if(!a||!b||!c)return false;
memcpy(backup, st, sizeof st);
while (b){ //取b每一位
int x = b % 10;
b = b/ 10;
if(!x||backup[x])return false;
backup[x]=true;
}
for (int i = 1; i <= 9; i ++ ){//检查1~9是否都已经用了
if(!backup[i]){
return false;
}
}
return true;
}
void dfs_c(int u,int a,int c){
if(u==10)return;
if(check(a,c)){//如果满足要求 那我们判断一下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){
if(a>=n)return;
if(a)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; //回溯
}
}
}
int main()
{
scanf("%d", &n);
dfs_a(0,0);//第一个参数表示已经用了的数字 第二个参数为当前a的值
printf("%d",ans);
return 0;
}