思路:
首先进行全排列,然后相当于用两个板子这一串数分成三个数字,
但是注意不能用 a + b / c == m这样去判断,因为 b / c 不一定是整除,注意: 比如 3 / 2 = 1
#include <iostream>
using namespace std;
int m;
const int N = 15;
bool st[N];
int cnt;
int path[N]; // 存储全排列的结果
int atob(int a, int b)
{
int res = 0;
for(int i = a; i <= b; i ++)
{
res = res * 10 + path[i];
}
return res;
}
bool isValid()
{
int a, b , c;
for(int i = 1; i < 8; i ++)
{
for (int j = i + 1; j < 9; j ++)
{
a = atob(1, i);
b = atob(i+1, j);
c = atob(j + 1, 9);
if(c * (a - m) + b == 0)
{
return true;
}
}
}
return false;
}
void dfs(int u)
{
if( u > 9)
{
if(isValid()) cnt += 1;
}
for(int i = 1; i <= 9; i ++)
{
if(!st[i])
{
st[i] = true;
path[u] = i;
dfs(u + 1);
st[i] = false;
}
}
}
int main()
{
cin>>m;
dfs(1);
cout<<cnt;
}