带分数
题目
100 可以表示为带分数的形式:100=3+69258/714
还可以表示为:100=82+3546/197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。
数据范围
1 ≤ N < 1 0 6 1≤N<10^6 1≤N<106
输入样例
100
输出样例
11
题解
思路
- 暴力枚举 1-9 的所有排列
- 再对其分段代表不同位置的数字
- 最后再按公式计算三个位置的结果
#include <iostream>
using namespace std;
const int N = 12;
int n, a[N], res;
bool st[N];
int val(int l, int r) {
int res = 0;
for (int i = l; i <= r; i ++)
res = res * 10 + a[i];
return res;
}
void dfs(int u) {
if (u == 9) {
for (int i = 1; i <= 7; i ++)
for (int j = 1; j <= 7 && i + j < 9; j ++) {
int t = val(0, i - 1), v = val(i, i + j - 1), d = val(i + j, 8);
if ((t + (double)v / (double)d) == n) res ++;
}
return;
}
for (int i = 1; i <= 9; i ++)
if (!st[i]) {
st[i] = true;
a[u] = i;
dfs(u + 1);
st[i] = false;
}
}
int main () {
cin >> n;
dfs(0);
cout << res;
return 0;
}