题目链接:AcWing 1209. 带分数
100 可以表示为带分数的形式:100=3+69258/714
还可以表示为:100=82+3546/197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100有 11种表示法。
输入格式 一个正整数。
输出格式 输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。
数据范围 1≤N<106
输入样例1: 100
输出样例1: 11
输入样例2: 105
输出样例2: 6
程序说明:
先求出1~9的全排列,然后划分成三段(隔板法),判断每段是否满足要求。
代码如下:
#include <iostream>
using namespace std
;
int a
[10], st
[10], n
, res
;
int cal(int l
, int r
) {
int t
= 0;
for(int i
= l
; i
<= r
; i
++)
t
= t
* 10 + a
[i
];
return t
;
}
void dfs(int k
) {
if(k
== 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(c
* n
== c
* a
+ b
)
res
++;
}
}
return;
}
for(int i
= 1; i
<= 9; i
++) {
if(!st
[i
]) {
st
[i
] = 1;
a
[k
] = i
;
dfs(k
+ 1);
st
[i
] = 0;
}
}
}
int main() {
cin
>>n
;
dfs(0);
cout
<<res
;
return 0;
}