標籤:
P1279Leave-綠光Accepted標籤:[顯示標籤]背景
期待這一份幸運,和一份衝勁,多麼奇妙的際遇……。燕姿在演唱完綠光這首歌后,出給了姿迷一個考題。
北歐有一個傳說!
人一生中能看見綠光!
他就一生都可以得到幸福!
描述
燕姿唱完這首歌,天上降落了一道綠光,在地上形成了一個矩形的映射,矩形的長為a,寬為b。燕姿向姿迷出了一個考題,誰能夠把這個矩形綠光陣分成若干個正整數的正方形,誰的正方形邊長之和最小,他就將得到燕姿的一個合影。姿迷們都很想得到合影,可是怎麼分才最小呢?大家都束手無策,現在,這個問題交給你了。
歌迷X:嗚嗚嗚,俺的語文不好,聽不懂你在講什麼。
燕姿:別怕,其實這個問題可以簡化為……
將邊長為正整數a,b的長方形劃分成若干邊長均為正整數,每個正方形的邊均平行於矩形的相應邊,試求這些正方形邊之和的最小值MIN。
(如果這個長方形可以分成N個正方形,其中每個邊長為Ai,那麼MIN=A1+A2+^^^+AN
注意,數組A中的元素可能相等)
格式輸入格式
一共10行
每行兩個正整數,Ai,Bi
對於30%的資料,Ai,Bi<maxint
對於100%的資料,Ai,Bi<maxlongint;
輸出格式
一共10行
每行一個整數,輸出MINi
範例1範例輸入1[複製]
1 12 13 14 15 16 17 18 19 110 1
範例輸出1[複製]
12345678910
限制
每點1s
提示
對於範例,可全分長邊長為一的正方形,並
記所求最小值為f(m,n),可以證明f(m,n)=m+n-(m,n). (*)
其中(m,n)表示m和n的最大公約數.
事實上,不妨設m≥n.
(1)關於m歸納,可以證明存在一種合乎題意的分法,使所得正方形邊長之和恰為m+n-(m,n).
當m=1時,命題顯然成立.
假設當m≤k時,結論成立(k≥1).當m=k+1時,若n= k+1,則命題顯然成立.若n< k+1,從矩形ABCD中切去正方形一個邊長為n(),
由歸納假設剩下的矩形有一種分法使得所得正方形邊長之和恰為m-n+n-(m-n,n)= m-(m,n).
於是原矩形ABCD有一種分法使得所得正方形邊長之和為m+n- (m,n).
(2)關於m歸納可以證明(*)成立.
當m=1時,由於n=1,顯然f (m,n)=1= m+n- (m,n).
假設當m≤k時,對任意1≤n≤m有f (m,n)= m+n- (m,n).
若m=k+1,當n= k+1時,顯然f(m,n)= k+1= m+n- (m,n).
當1≤n≤k時,設矩形ABCD按要求分成了p個正方形,其邊長分別為a1,a2,…,ap,不妨設a1≥a2≥…≥ap.
顯然a1=n或a1若a1 m+n- (m,n).
若a1=n,則一個邊長分別為m-n和n的矩形可按題目要求分成邊長分別為a2,…,ap的正方形,由歸納假設
a2+…+ap≥m-n+n-(m-n,n)= m- (m,n).
從而a1+a2+…+ap≥m+n-(m,n).
於是當m=k+1時,f(m,n)≥m+n- (m,n).
再由(1)可知f (m,n)=m+n- (m,n).
#!/usr/bin/env python3# -*- coding: utf-8 -*-def gcd(a, b): if not b: return a else : return gcd(b, a % b)def lcm(a, b): return a + b - gcd(a, b)import sysimport mathfor i in range(10): a, b = map(int,raw_input().split()) print lcm(a, b)
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
vijos - P1279Leave-綠光(數學歸納法 + python)