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

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
#include
#include
#include
#include
#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);
}

你可能感兴趣的:(数论,51Nod)