51nod 1719 数值计算(二分)
2016-10-09 14:22
375 查看
1719 数值计算
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注
令 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位
Input
三个数 A B n
Output
答案 保留3位小数
Input示例
5 4 1000
Output示例
1572338.870
一个很复杂的式子,然后不会做。
后来才知道,其实里面的k,按照那个诱导公式展开
得到F(x)=Asinx+Bcosx=Csin(x+a)
然后就是每π个必定有一个解,所以只要求第一个最小正数解
所以第一个正解肯定在[0,π]之间,然后并且这个函数在这个之间是单调的,所以可以二分
先判0点的时候值是0还是正还是负,然后二分搞就行了
注意精度,1e−8可以过
代码:
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注
令 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位
Input
三个数 A B n
Output
答案 保留3位小数
Input示例
5 4 1000
Output示例
1572338.870
一个很复杂的式子,然后不会做。
后来才知道,其实里面的k,按照那个诱导公式展开
得到F(x)=Asinx+Bcosx=Csin(x+a)
然后就是每π个必定有一个解,所以只要求第一个最小正数解
所以第一个正解肯定在[0,π]之间,然后并且这个函数在这个之间是单调的,所以可以二分
先判0点的时候值是0还是正还是负,然后二分搞就行了
注意精度,1e−8可以过
代码:
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> #pragma comment(linker,"/STACK:102400000,102400000") using namespace std; #define MAX 100005 #define MAXN 1000005 #define maxnode 105 #define sigma_size 30 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lrt rt<<1 #define rrt rt<<1|1 #define middle int m=(r+l)>>1 #define LL long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define pii pair<int,int> #define bits(a) __builtin_popcount(a) #define mk make_pair #define limit 10000 //const int prime = 999983; const int INF = 0x3f3f3f3f; const LL INFF = 0x3f3f; const double pi = acos(-1.0); //const double inf = 1e18; const double eps = 1e-8; const LL mod = 1e9+7; const ull mx = 133333331; /*****************************************************/ inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; } /*****************************************************/ int main(){ double a,b,n; scanf("%lf%lf%lf",&a,&b,&n); double l=0,r=pi; double tmp=0; for(int i=1;i<=10000;i++){ tmp+=a/(i+sin(i))*sin(i)+b/(i+cos(i))*cos(i); } double ans; if(abs(tmp)<eps) ans=pi; else{ for(int t=0;t<100;t++){ double mid=(l+r)/2; double temp=0; for(int i=1;i<=10000;i++){ temp+=a/(i+sin(i))*sin(mid+i)+b/(i+cos(i))*cos(mid+i); } if(abs(temp)<eps){ ans=mid; break; } if(tmp<0){ if(temp<0) l=mid; else r=mid; } else{ if(temp<0) r=mid; else l=mid; } } } printf("%.3f\n",n*ans+n*(n-1)*pi/2); return 0; }
相关文章推荐
- 51Nod-1719-数值计算
- 51nod 1719 数值计算
- 51nod1719数值计算+二分
- Matlab数值计算差商与插值
- 请分别输入年月日三个数值,计算出这是这一年的第几天? (提示:要考虑闰年和2月的情况)
- 51Nod 1298 圆与三角形 (计算几何)
- C++数值计算资源
- Xml解析并计算物体坐标数值
- 数值计算——矩阵求逆误差测试(n=2000)
- 51NOD 1105 第K大的数 【二分】
- ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)
- 数值计算网址
- [538 Convert BST to Greater Tree]搜索二叉树的数值计算
- 计算一个任意数值的位数
- time.c 的Java实现(从timestamp计算年月日时分秒等数值)
- 【书单】matlab 科学计算、数值分析以及数学物理问题
- Scipy教程 - python数值计算库
- 51nod 平均数(二分+离散+树状数组)
- 将问题转化为数值计算
- java数值精确计算