藍橋杯 PREV 3 歷屆試題 帶分數

2021-10-03 19:45:28 字數 1908 閱讀 2112

資源限制

時間限制:1.0s 記憶體限制:256.0mb

問題描述

100 可以表示為帶分數的形式:100 = 3 + 69258 / 714。

還可以表示為:100 = 82 + 3546 / 197。

注意特徵:帶分數中,數字1~9分別出現且只出現一次(不包含0)。

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

輸入格式

從標準輸入讀入乙個正整數n (n<1000*1000)

輸出格式

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

注意:不要求輸出每個表示,只統計有多少表示法!

樣例輸入1

100樣例輸出1

11樣例輸入2

105樣例輸出2

6輸入乙個n,讓我們實現n的帶分數表示,即n = a + b / c,將分數化簡後可以得到這樣的等式:c * n = a * c + b

那麼,我想到的作坊當然就是在1~9內先列舉排列 1 ~ 9,然後用 for 迴圈生成 a,b,c 三個值,而普通暴力列舉的做法實在是太低階了,所以我們用 dfs 搜尋。在藍橋杯中,搜尋類題目也是常考題型

**講解在注釋中:

#include

#include

#include

#include

typedef

long

long ll;

using

namespace std;

const

int maxn =

1e7;

int n;

int num[12]

;// 表示我們生成的數字陣列

bool used[12]

;// 標記1~9在本次dfs中是否已經使用過

int ans;

// ans全域性變數

// 劃定左右邊界,將num陣列轉化為int型數值的函式

intcalc

(int l,

int r)

return res;}/*

u 是乙個用來標記dfs層數的值,不應該省略

當u大於9時說明dfs到達了最後一層,我們的9個數的全排列已經生成了

這時只要用這9個數生成 a, b, c 即可

*/void

dfs(

int u)}}

// 對 1 ~ 9 進行全排列

for(

int i =

1; i <=

9; i++)}

}int

main()

#include

#include

#include

#include

typedef

long

long ll;

using

namespace std;

const

int n =10;

int n;

bool st[n]

, backup[n]

;int ans;

bool

check

(int a,

int c)

for(

int i =

1; i <=

9; i++)}

return

true;}

void

dfs_c

(int u,

int a,

int c)}}

void

dfs_a

(int u,

int a)}}

intmain()

PREV 3 藍橋杯歷屆試題 帶分數

問題描述 100 可以表示為帶分數的形式 100 3 69258 714。還可以表示為 100 82 3546 197。注意特徵 帶分數中,數字1 9分別出現且只出現一次 不包含0 類似這樣的帶分數,100 有 11 種表示法。輸入格式 從標準輸入讀入乙個正整數n n 1000 1000 輸出格式 ...

藍橋杯 PREV 3 帶分數

歷屆試題 帶分數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 100 可以表示為帶分數的形式 100 3 69258 714。還可以表示為 100 82 3546 197。注意特徵 帶分數中,數字1 9分別出現且只出現一次 不包含0 類似這樣的帶分數,100 有 11 種表示法。輸入格...

藍橋杯 PREV 3 帶分數

資源限制 時間限制 1.0s 記憶體限制 256.0mb 100 可以表示為帶分數的形式 100 3 69258 714。還可以表示為 100 82 3546 197。注意特徵 帶分數中,數字1 9分別出現且只出現一次 不包含0 類似這樣的帶分數,100 有 11 種表示法。從標準輸入讀入乙個正整數...