Poj 4227 反正切函数的应用
2015-08-15 11:38
465 查看
Description
Input
Output
Sample Input
Sample Output
反正切函数可展开成无穷级数,有如下公式 (其中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代码如下:
///@zhangxiaoyu ///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; }
相关文章推荐
- 9.10扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
- CWnd与HWND的区别 (2
- 《编程之美》1.6 饮料供货——贪心解法证明
- 支付交易中遇到浮点数精度的问题
- new() 与new
- What is the modified poplar formwork plywood
- [bfs]AOJ 0558 Cheese
- 8-MATLAB绘图
- android-----上传文件到服务器
- iOS开发-通过 objc_setAssociatedObject alert 和 button关联 及传值
- LoadRunner脚本创建、录制和添加事务
- IntelliJ IDEA系列教程四 MAVEN的集成与使用
- Android 开发中 如何将xml文件封装成对象,存放到数组中?
- C++中的三大件
- 【SpringMVC整合MyBatis】springmvc对RESTful支持
- win7中设置保护眼睛的绿豆沙色
- 9.10扩展性与存储限制(一)——对于超大型的社交网站,展示两个人之间的“连接关系”或“社交路径”
- 6-使用MATLAB进行概率统计分析
- 5-求解线性方程组
- DataGridView 隔行换色后再根据数据换色