資源限制
時間限制: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 種表示法。從標準輸入讀入乙個正整數...