[AcWing] 帶分數

帶分數

題目

100 可以表示爲帶分數的形式:100=3+69258/714
還可以表示爲:100=82+3546/197
注意特徵:帶分數中,數字 1∼9 分別出現且只出現一次(不包含 0)。

類似這樣的帶分數,100 有 11 種表示法。

輸入格式

一個正整數。

輸出格式

輸出輸入數字用數碼 1∼9 不重複不遺漏地組成帶分數表示的全部種數。

數據範圍

1N<1061≤N<10^6

輸入樣例

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章