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
思路:根據公式arctan(p)+arctan(q)=arctan[(p+q)/(1-pq)] ==> a = (bc - 1) / (b + c)
再整理一下 q = b+c = (c^2 + 1) / (c - a) = c + a + (a^2 + 1) / (c - a),
這樣等式的右邊就只有a和c了。
因為a是給定的,所以q為c的乙個函式。求q的導數有:q' = 1 - (a^2 + 1)/ (c - a)^2。
令q' = 0,有c = a + sqrt(a^2 + 1)。
根據極限的知識知道,q在c = a + sqrt(a^2 + 1)存在乙個最小值。
但因為c為整數,q是個離散函式,無法取到該極限,不過q的最小值
一定是所有值中最接近該極限的。所以我們從
c = 2a開始左右擺動搜尋,逐漸擴大擺動範圍,直到找到乙個c滿足c-a能整除a^2 + 1。
#include#include#include#include#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll min(ll a,ll b)
int main()
if (a + c + 1 <= a && a % (a + c + 1) == 0)
}printf("%lld\n",ans);
return 0;
}
反正切函式的應用
反正切函式的應用crawling in process.crawling failed time limit 1000msmemory limit 10000kb64bit io format i64d i64u submit status description 反正切函式可展開成無窮級數,有如下...
反正切函式的應用
time limit 1000ms memory limit 10000k 反正切函式可展開成無窮級數,有如下公式 使用反正切函式計算pi是一種常用的方法。例如,最簡單的計算pi的方法 pi 4arctan 1 4 1 1 3 1 5 1 7 1 9 1 11 公式 2 然而,這種方法的效率很低,但...
1734 反正切函式的應用
2001年noi全國競賽 時間限制 3 s 空間限制 64000 kb 題目等級 大師 master 題解都在圖里 輸入描述 input description 輸入只有乙個正整數a,1 a 60000.輸出描述 output description 乙個整數,為b c 的值 樣例輸入 sample...