反正切函式可展開成無窮級數,有如下公式
使用反正切函式計算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
#include #include #include #define i64 __int64
int main()
} }return 0;
}
i是小於a的,所以從a開始查詢,題目要求找最小值,我好像只是單純的找出數而已,其實這是個典型的數學問題,通過(1/a)=((1/b)+(1/c))/(1-(1/b)*(1/c)),又因為b>a,c>a,所以可設c=a+n,b=a+m,解得a*a+1=m*n;m+n+a+a即為b+c。所以就是求m+n的最小值。
以下還有個c++的**,可以參考一下,因為這個的演算法好一點,起碼時間少了1/2;#include #include #include #define i64 __int64
int main()
}printf("%i64d\n", 2 * a + m + n);
}return 0;
}
B 反正切函式的應用解題報告(賀奕凱)
b 反正切函式的應用 time limit 1000msmemory limit 10000kb64bit io format i64d i64u submit status practice poj 1183 description 反正切函式可展開成無窮級數,有如下公式 使用反正切函式計算pi是...
反正切函式的應用
反正切函式的應用crawling in process.crawling failed time limit 1000msmemory limit 10000kb64bit io format i64d i64u submit status description 反正切函式可展開成無窮級數,有如下...
反正切函式的應用
description 反正切函式可展開成無窮級數,有如下公式 使用反正切函式計算pi是一種常用的方法。例如,最簡單的計算pi的方法 pi 4arctan 1 4 1 1 3 1 5 1 7 1 9 1 11 公式 2 然而,這種方法的效率很低,但我們可以根據角度和的正切函式公式 tan a b t...