TSOJ課程 24 1426 分數數列2

2021-09-22 22:50:07 字數 1698 閱讀 9075

題目描述:

已知乙個分數數列的如下:1/2,3/5,4/7,6/10,8/13,9/15,…。輸入該數列的第n項,輸出對應項的值(用分數表示)

其中0輸入描述:多組輸入,每組輸入乙個正整數n,表示該數列的第n項

輸出描述:
對應於每組輸入,輸出該項對應的分數表示的值。

樣例輸入:
樣例輸出:
3253/5264

這道題**倒是不難,主要是研究這個數列究竟是什麼規律。那麼這道題就變成了一道小學找規律題。

那麼,如何快速的發現這道題的數列規律呢?這裡教大家乙個野路子,如果感興趣的可以看一看,不感興趣的略過即可。

大部分的oj系統都是可以檢視其他人做這道題的結果的,我們查詢一下這道題的ac(就是通過的)資料,發現絕大部分的人通過的耗時都是20ms~40ms。

在oj裡,這個耗時可以反映出你的演算法的時間複雜度,如果說這道題的數列是有通項公式的,那麼一般耗時都是o(1)或者o(n),也就是0ms,但是通過的**都有耗時,說明要麼通項公式裡混有高時間複雜度(至少為o(n))的項(比如組合數、階乘),要麼就說明式子根本沒有通項公式。順著這兩個思路去思考,式子很快就出來了。

那麼如果查詢的結果發現基本上都是0ms,那麼就從通項公式的角度去思考,也能很快的得到答案。

下面正式講解規律的尋找:

首先,乙個數列可能存在不止乙個規律,我們的目標就是能找乙個是乙個,然後再根據已經找到的規律繼續找。首先這個數列最顯眼最一眼能看出來的,就是分子和分母的差。很明顯:第乙個數字的分子減分母是1,第二個為2,第三個為3……然後再根據題目給出的第2011項確認一下,第2011項差2011,說明這個規律是正確的。

接下來我們順著這個思路去找,既然分子和分母的值是相對確定的(即確定了其中乙個就能確定另外乙個),那麼我們就想辦法確定其中乙個。我們敏銳的發現,分子似乎從來都不重複,分母也是,所以我們猜測:分子可能是從來沒有使用過的數字之中最小的那個。比如說第二項的分子3,就是因為1和2都被用過了,所以用了3,而第三項的分子4,是因為1、2、3、5都被用過了,所以選擇了4。我們在不考慮執行速度的情況下寫乙個**跑一下,發現2011項真的是3253/5264,那麼這道題的規律就被我們找到了。

在**部分,我用了預處理的方法。預處理主要是用來針對多組輸入的。如果題目給出的資料是多組輸入,那麼傳統的做法是每給乙個資料就算一次,這樣會出現很多重複計算。而預處理是在輸入之前就把所有的資料全部算出來,然後給什麼資料就輸出什麼資料,無論輸入的資料量有多少,執行時間都不會有太大的變化。

在接下來的題目中,我還會講到一種預處理的變體,思路是「算到哪存到哪」,從平均耗時上比預處理更優秀。

// tsoj-1426 分數數列2

#include

using

namespace std;

bool use[

10000]=

;int son[

3001]=

, father[

3001]=

;int now=0;

void

_init

(void)}

}}intmain()

return0;

}

分數數列演算法實現java

1.分數數列概念 乙個遞推的分數數列的前面六項為 1 2,3 5,4 7,6 10,8 13,9 15 歸納出數列的構成規律並輸出第n項以及前n項中的最大項的值 2.分析 該數列有兩個規律 1 分母d與分子c存在關係表示式 d c i,i表示當前顯示的是第i個數 2 分子c為前面i 1項中的所有分子...

Python 遞迴計算分數數列

c語言的課後習題 求數列 2 1,3 2,5 3,8 5,13 8,21 13,前50項的和 數列規律 第二項的分母是 前一項分子 第二項的分子是 前一項分子與分母的和 from fractions import fraction def fn x 計算每一項的值 time 1 fz 2 fm 1 ...

動規 二分 劃分數列

2.劃分數列 seq.pas c cpp 題目描述 給你乙個有n個元素的數列,要求把它劃分成k段,使每段元素和的最大值最小 輸入格式 第一行兩個正整數n,k 第二行為此數列ai 輸出格式 一行乙個數,為題目所求答案 樣例輸入 5 22 1 3 4 5 樣例輸出 資料規模 30 資料 n 30,k 1...