AcWing 1209. 带分数
原题链接
简单
作者:
Bug-Free
,
2020-02-17 00:06:07
,
所有人可见
,
阅读 959
新的理解
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 1e1;
typedef long long ll;
int n, ans;
bool st[N], backup[N];
bool check(int a, int c)
{
ll b = n * ( ll )c - a * c;
if(!a || !b || !c) return false;
memcpy(backup, st, sizeof backup); // st不能动, 所以copy了一份
while(b)
{
int x = b % 10;
b /= 10;
if(!x || backup[x]) return false;
backup[x] = true;
}
for(int i = 1; i <= 9; i++)
{
if(!backup[i]) return false; // 如果1-9 有一个数字没有出现, 那么就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); //此时a保持不变
st[i] = false;
}
}
return;
}
void dfs_a(int u, int a)
{
if(a >= n) return;
if(a) dfs_c(u, a, 0); // u ,a ,c c从 0开始dfs
for(int i = 1; i <= 9; i++)
{
if(!st[i])
{
st[i] = true;
dfs_a(u + 1, a * 10 + i);
st[i] = false;
}
}
return;
}
int main(void)
{
scanf("%d", &n);
dfs_a(0, 0); // u, a
printf("%d\n", ans);
return 0;
}