Solution
来自讨论区
F
(
x
)
F(x)
F(x)可以最终写成
A
s
i
n
(
x
)
+
B
c
o
s
(
x
)
Asin(x)+Bcos(x)
Asin(x)+Bcos(x)的形式(用和角公式拆开)
考虑两直角边为A,B的Rt△,设其中一个内角为a,则(负数同样讨论)
F
(
x
)
=
A
s
i
n
(
x
)
+
B
c
o
s
(
x
)
(
设
t
=
A
+
B
)
F(x)=Asin(x)+Bcos(x)(设t=\sqrt{A+B})
F(x)=Asin(x)+Bcos(x)(设t=A+B)
=
t
∗
(
A
/
t
∗
s
i
n
(
x
)
+
B
/
t
∗
c
o
s
(
x
)
)
(
A
/
t
=
c
o
s
(
a
)
)
=t*(A/t*sin(x)+B/t*cos(x))(A/t=cos(a))
=t∗(A/t∗sin(x)+B/t∗cos(x))(A/t=cos(a))
=
t
∗
(
c
o
s
(
a
)
s
i
n
(
x
)
+
s
i
n
(
a
)
c
o
s
(
x
)
)
=t*(cos(a)sin(x)+sin(a)cos(x))
=t∗(cos(a)sin(x)+sin(a)cos(x))
=
t
∗
s
i
n
(
x
+
a
)
=t*sin(x+a)
=t∗sin(x+a)
发现
F
(
x
)
F(x)
F(x)的正负性在
[
0
,
π
)
[0,π)
[0,π)单调,就可以二分查找零点,
函数以
π
π
π为最小周期,即可求出前
n
n
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);
}