题目传送门:带分数
全排列+三段分数据
#include<iostream>
using namespace std;
const int N = 10;
int path[N]; // 保存全排列结果
bool st[N]; // 生成全排列时标记是否使用过
int target, cnt;// 目标数和答案个数
//算出区间内的数
int cal(int l, int r)
{
int res = 0;
for(int i = l;i <= r;i ++)
{
res = res * 10 + path[i];
}
return res;
}
void dfs(int u)
{
// 将两层循环分为三段
if(u == 9)
{
for (int i = 0; i < 7; i ++ )
{
for (int j = i + 1; j < 8; j ++ )
{
int a = cal(0, i);
int b = cal(i + 1, j);
int c = cal(j + 1, 8);
// 通分
if(a * c + b == target * c) cnt ++;
}
}
return;
}
for(int i = 1;i <= 9;i ++)
{
if(!st[i])
{
path[u] = i;
st[i] = true; // 标记被使用过
dfs(u + 1);
st[i] = false; // 还原现场
}
}
}
int main()
{
scanf("%d", &target);
dfs(0);
printf("%d\n",cnt);
return 0;
}
?