蓝桥杯真题 杨辉三角形 python
- 專欄
- 《藍橋杯題目》
目錄
????????【問題描述】
????????【輸入格式】
????????【輸出格式】
????????【樣例輸入】
????????【樣例輸出】
????????【評測用例規模與約定】
??????????省流版本:
??????????題目解析:
??????????綜上所述,寫成代碼如下所示:
【問題描述】
下面的圖形是著名的楊輝三角形:
如果我們按從上到下、從左到右的順序把所有數排成一列,可以得到如下數列:
1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, …
給定一個正整數 N,請你輸出數列中第一次出現 N 是在第幾個數?
【輸入格式】
輸入一個整數 N。
【輸出格式】
輸出一個整數代表答案。
【樣例輸入】
6
【樣例輸出】
13
【評測用例規模與約定】
對于 20% 的評測用例,1 ≤ N ≤ 10;
對于所有評測用例,1 ≤ N ≤ 1000000000。
省流版本:
如果直接用暴力枚舉的話,需要求出每一行的全部數字,然后判斷每一行中是否存在該整數,思路可以,但是時間復雜度太大,只能拿30%。如果根據二項式定理,找出從哪一行開始只需要遍歷前三個數,然后利用求和公式直接計算答案,就可以大大減少時間復雜度。
題目解析:
首先介紹一下楊輝三角的性質:
1、每個數等于它上方兩個數的和。
2、左右對稱(說明最先出現的數一定在左邊)
3、第n行有n個數,前n行就有(n+1)*n/2個數
4、n+1行的數是(a+b)^n展開后各項的系數
所以,由性質4可得,第n行的m個元素為C(n-1,m-1),由于1 ≤ N ≤ 1000000000,每一行第四個數為N*(N-1)*(N-2)/6,粗略計算,當N>1900時,第四項就大于1000000000了,所以說,從第1901行開始,N若是第一次出現,只可能出現在第二第三項。
因此,在前1900層時,可以直接使用暴力枚舉,在判斷是否在該層,若不在前面1900層,先粗略估計N所在的層數(先計算在第三項時,因為若存在,就會先出現)int((N*2)**0.5),這時,就只需要判斷三種情況:①N在該層;②N在下一層;③N在N+1層。
最后計算在第幾個數上,分為三種情況:
1、在前1900層時,(c*c+c)//2+j+1 ,在c+1層的第j+1個數時(j是在列表中的下表,因此要加1)
2、在1900層之后且是第三項時,(k*(k+1))//2+3,第k+1行
3、在1900層之后且是第二項時,(N*(N+1)//2)+2,第N+1行時
綜上所述,寫成代碼如下所示:
N=int(input()) n=[1] #第一層 c=1 #層數 if N==1:print(1) else:#由于第1900層開始,N只會出現在第二個或第三數字上,所以1900開始,不需要求全部while c<1900:n = [1]+[n[j]+n[j+1] for j in range(len(n)-1)]+[1] #楊輝三角遞推公式if N not in n[1:len(n)-1]: #判斷N是否在c層上c=c+1else:break if c==1900:k=int((N*2)**0.5) #粗略計算出現的層數 #N出現在第三個數上while (k*(k-1))//2<N:k=k+1if (k*(k-1))//2==N:print((k*(k+1))//2+3)#N出現在第二個數上else:print((N*(N+1)//2)+2) # N會出現在第N+1層 #N在前1900層上時 for j in range(len(n)):if n[j]==N:print(((c*c+c)//2)+j+1) break最后運行一下結果。。。。。
總結
以上是生活随笔為你收集整理的蓝桥杯真题 杨辉三角形 python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: comsol频域模拟
- 下一篇: Python+OpenCV实现车牌检测与