Poj 4227 反正切函數的應用
阿新 • • 發佈:2017-07-30
有一個 add ide text var pre typedef 函數 asc
Description
反正切函數可展開成無窮級數。有例如以下公式
(當中0 <= x <= 1) 公式(1)
使用反正切函數計算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
1
Sample Output
5
題意:本題在給定1/a=(1/b+1/c)/1-(1/a*(1/b))的情況下,要求最小的a+b,每個例子給定a。假設我們枚舉b和c的話。時間消耗不起。我們自然想到把b,c表示為和a相關的等式。顧設b=a+m,c=a+n,帶入上式化簡得(a*a+1)=m*n。如今僅僅要逆序枚舉m或者n就能夠了。
ac代碼例如以下:
[email protected]
///2015/8/13
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
int main()
{
LL a;
int i;
while(~scanf("%lld",&a))
{
for(i=a;i>=1 ;i--)
{
if((a*a+1)%i==0)
break;
}
LL ans;
ans=i+(a*a+1)/i+2*a;
printf("%lld\n",ans);
}
return 0;
}
Poj 4227 反正切函數的應用