【51Nod算法马拉松18 C】数值计算

来源:互联网 发布:prezi软件破解版 编辑:程序博客网 时间:2024/05/29 14:48

Description

F(x)=wk=1(Ak+sin(k)sin(x+k)+Bk+cos(k)cos(x+k))
求F(x)=0的前n小的正根的和。
n<=3e6,A<=1e3,B<=1e3
其中w是定值,为1e4
保留到小数点后3位

Solution

这种求方程的根的题目,肯定有循环周期的。
这个正弦和余弦的函数显然有一个π=3.141592653589793238......的周期。
然后我假设函数在0~π是单调的,然后二分出了一个零点(要把精度开的超大)二分出第一个零点l=3.1133390914355221......,然后不断的加π就可以了。
由于三角函数的数学功底不够,不会证明为什么是单调。

Code

#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;int A,B,n,i;double k,l,t,r,mid,ans,gen;double doing(double x){    int i;double y=0;    fo(i,1,10000){        y+=A*sin(x+i)/(i+sin(i))+B*cos(x+i)/(i+cos(i));    }    return y;}int main(){    scanf("%d%d%d",&A,&B,&n);  /*  l=0,r=3.14159265358979323846264;    while(r-l>0.0000000001){        mid=(l+r)/2;        if(doing(mid)<0)l=mid;else r=mid;    }*/    l=3.1133390914355221;    fo(i,1,n){        ans+=l;        l+=3.14159265358979323846264;    }    printf("%.3f\n",ans);}
2 0
原创粉丝点击