题目传送门:带分数
试题解析
全排列+三段分数据
#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;
}