当前位置: 代码迷 >> 综合 >> AcWing 1209. 带分数【DFS】【枚举】
  详细解决方案

AcWing 1209. 带分数【DFS】【枚举】

热度:60   发布时间:2024-02-26 15:16:50.0

题目链接: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;
}