【問題描述】
已知m、n為整數,且滿足下列兩個條件:
① m、n∈,即1≤m,n≤k,(1≤k≤109)。
②(n2-m*n-m2)2=1
你的任務是:程式設計輸入正整數k,求一組滿足上述兩個條件的m、n,並且使m2+n2的值最大。例如,從鍵盤輸入k=1995,則輸出:m=987 n=1597。
【輸入樣例】
【輸出樣例】
**如下:
1view codelong
m,n,k;
2double
delt1,delt2,n1,n2;
3 scanf("
%d",&k);
4for(m=k;m>=1;m--)
516 printf("
m=%d\nn=%d\n
",m,n);
批註:該演算法確實挺好,簡潔、高效率,但是有乙個問題比較明顯,那就是當k的值達到10^9時,for迴圈內,m從k開始向1遍歷。當m的值取10^9時,計算delt的時候,m^2會溢位。而且並非只有當k達到10^9才會有這個問題,當k達到10^5時就會出現這個問題。想要自己寫乙個函式去實現高精度數的開平方根,似乎也不是這麼容易。所以,可以看看下面的遞推演算法。
標準答案是:
**如下:
1int n=1,m=1
,k,t;
2 cin>>k;3do
411}12
while(t<=k);
13 cout<
批註:一開始閱讀該演算法,實在無法理解為何會是跟斐波那契數列一樣的規律。後來查資料,閱讀理解,終於看懂。下面做乙個記錄。
極值問題(dp)
問題描述 已知m n為整數,且滿足下列兩個條件 m n 即1 m,n k,1 k 109 n2 m n m2 2 1 你的任務是 程式設計輸入正整數k,求一組滿足上述兩個條件的m n,並且使m2 n2的值最大。例如,從鍵盤輸入k 1995,則輸出 m 987 n 1597。輸入樣例 1995 輸出樣...
筆記 RMQ區間極值問題
專題 區間最小 最大查詢 range minimum maximum query rmq問題 描述 已知長度為l的數列a,詢問區間 l,r 中的最值。若詢問的次數較少,可以用線性的複雜度來查詢,但如果詢問的次數過多且l過大,那麼複雜度就會很高。所以需要更快速的查詢方法。st演算法 預處理o nlog...
問題 B 列印極值點下標
在乙個整數陣列上,對於下標為i的整數,如果它大於所有它相鄰的整數,或者小於所有它相鄰的整數,則稱為該整數為乙個極值點,極值點的下標就是i。每個案例的輸入如下 有2 n 1行輸入 第一行是要處理的陣列的個數n 對其餘2 n行,第一行是此陣列的元素個數k 4每個案例輸出不多於n行 每行對應於相應陣列的所...