思路:1-9全排列
然后对每个排列划分为三段,判断是否满足x+y/z的形式
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int n;
int a[15];
bool vis[15];
int ans;
void print(int *a)
{
for(int i = 1; i <= 10; ++i){
cout << a[i] <<" ";
}
}
int cal(int st,int en)
{
int num = 0;
for(int i = st; i <= en; ++i){
num = num*10 + a[i];
}
return num;
}
void judge(int a[]){//x + y/z
for(int i = 1; i < 9; ++i){
int x = cal(1,i);
if(x >= n)//如果 x大于n了 肯定不满足
break;
for(int j = i+(9-i)/2; j <= 9; ++j){//分子数字位数大于等于分母的 减少计算
int y = cal(i+1,j-1);
int z = cal(j,9);//不知道为啥不能 cal(j+1,9)
if((y%z == 0) && (x + y/z == n))
++ans;
}
}
}
void dfs(int pos)//算出 1-9的全排列
{
if(pos == 10){
judge(a);
return ;
}
for(int i = 1; i <= 9; ++i){
if(!vis[i]){
vis[i] = true;
a[pos] = i;
dfs(pos+1);
vis[i] = false;
}
}
}
int main()
{
while(cin >> n){
ans = 0;
dfs(1);
cout <<ans<<endl;
}
}