description
反正切函式可展開成無窮級數,有如下公式
使用反正切函式計算pi是一種常用的方法。例如,最簡單的計算pi的方法:
pi=4arctan(1)=4(1-1/3+1/5-1/7+1/9-1/11+...) 公式(2)
然而,這種方法的效率很低,但我們可以根據角度和的正切函式公式:
tan(a+b)=[tan(a)+tan(b)]/[1-tan(a)*tan(b)] 公式(3)
通過簡單的變換得到:
arctan(p)+arctan(q)=arctan[(p+q)/(1-pq)] 公式(4)
利用這個公式,令p=1/2,q=1/3,則(p+q)/(1-pq)=1,有
arctan(1/2)+arctan(1/3)=arctan[(1/2+1/3)/(1-1/2*1/3)]=arctan(1)
使用1/2和1/3的反正切來計算arctan(1),速度就快多了。
我們將公式(4)寫成如下形式
arctan(1/a)=arctan(1/b)+arctan(1/c)
其中a,b和c均為正整數。
我們的問題是:對於每乙個給定的a(1 <= a <= 60000),求b+c的值。我們保證對於任意的a都存在整數解。如果有多個解,要求你給出b+c最小的解。
input
輸入檔案中只有乙個正整數a,其中 1 <= a <= 60000。
output
輸出檔案中只有乙個整數,為 b+c 的值。
sample input
1sample output
5
看著題目雖然很難懂,但只要弄懂了其中的關鍵,你就會發覺這道題其實很簡單。這道題其實完全可以看做是一道數學題,基本沒有涉及什麼演算法。由題目可以知道1/a=(1/b+
1/c)/(1-1/b*1/c),化簡的a=(b*c-1)/(b*c),由題目可得b,c>a,令b=a+m,c=a+n,代入上式可得m*n=a*a+1;令m=(a*a+1)/n;則b+c的最小值即為m+n的最小值,即當
(a*a+1)取模n==0時有最小值。
#includeusing namespace std;
int main()
{ long long a;
int n;
while(cin>>a)
{ for(n=a;;n--)
{ if((a*a+1)%n==0)
{cout<
poj1183 反正切函式
第一道poj的題更博,類似於博主這種英文水平,也就切一切這種中文題了吧!題目大意 給你正整數a,求滿足條件的 b 和 c,使得 frac frac frac 且 b c 的和最小。注釋 1 a 60,000 想法 乍一看,數論啊!嘻嘻嘻嘻,好開心,但是沒做出來。問了一下神犇ck蛤學長,掌握了一種極猛...
(POJ 1183)反正切函式的應用
反正切函式的應用 description 反正切函式可展開成無窮級數,有如下公式 使用反正切函式計算pi是一種常用的方法。例如,最簡單的計算pi的方法 pi 4arctan 1 4 1 1 3 1 5 1 7 1 9 1 11 公式 2 然而,這種方法的效率很低,但我們可以根據角度和的正切函式公式 ...
POJ 1183 反正切函式的應用
description 反正切函式可展開成無窮級數,有如下公式 其中0 x 1 公式 1 使用反正切函式計算pi是一種常用的方法。例如,最簡單的計算pi的方法 pi 4arctan 1 4 1 1 3 1 5 1 7 1 9 1 11 公式 2 然而,這種方法的效率很低,但我們可以根據角度和的正切函...