1. 程式人生 > >Poj 4227 反正切函數的應用

Poj 4227 反正切函數的應用

有一個 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 反正切函數的應用