Solution
来自讨论区
F(x)可以最终写成 Asin(x)+Bcos(x)的形式(用和角公式拆开)
考虑两直角边为A,B的Rt△,设其中一个内角为a,则(负数同样讨论)
F(x)=Asin(x)+Bcos(x)(设t=A+B)
=t∗(A/t∗sin(x)+B/t∗cos(x))(A/t=cos(a))
=t∗(cos(a)sin(x)+sin(a)cos(x))
=t∗sin(x+a)
发现 F(x)的正负性在 [0,π)单调,就可以二分查找零点,
函数以 π为最小周期,即可求出前 n个正根
Code
#include<bits/stdc++.h>
using namespace std;
const double pi=acos(-1),eps=1e-6;
double a,b,n,k,l,r,mid,t,tmp,ans;
int main(){
scanf("%lf%lf%lf",&a,&b,&n);
for (k=1;k<=1e4;k++) tmp+=a/(k+sin(k))*sin(k)+b/(k+cos(k))*cos(k);
l=0,r=pi;
for (;;){
mid=(l+r)/2,t=0;
for (k=1;k<=1e4;k++) t+=a/(k+sin(k))*sin(k+mid)+b/(k+cos(k))*cos(k+mid);
if (fabs(t)<eps){
ans=mid;
break;
}
if (t*tmp>0) l=mid;
else r=mid;
}
printf("%.3lf",ans*n+n*(n-1)*pi/2);
}