参考:https://www.cnblogs.com/CQzhangyu/p/7500328.html

……其实理解了泰勒展开之后就是水题呢可是我还是用了两天时间来搞懂啊

泰勒展开是到正无穷的,但是因为精度问题,所以一般展开十几项就可以(这里展开了17项)。以下是公式:

\[e^x=\sum_{i=0}^{\infty}\frac{x^i}{i!}
\]

\[sin(x)=\sum_{i=0}^{\infty}\frac{(-1)^ix^{2i+1}}{(2i+1)!}
\]

然后用二项式定理把x替换成ax+b:

\[e^{ax+b}=\sum_{i=0}^{\infty}\frac{\sum_{j=0}^{i}C_i^ja^jx^jb^{i-j}}{i!}
\]

\[sin(ax+b)=\sum_{i=0}^{\infty}\frac{(-1)^i\sum_{j=0}^{2i+1}C_i^ja^jx^jb^{2i+1-j}}{(2i+1)!}
\]

展开的17项在splay上可以直接逐项加起来,然后计算答案的时候直接乘相应的x次方即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1000005,D=17;
int n,m,tp[N],st[N],top;
double a[N],b[N],jc[20],y[20][20],at[20],bt[20];
char s[100];
struct qwe
{
int f,c[2],sz,lz,tp;
double v[20],s[20],a,b;
void tl()
{
int i,j,f;
memset(v,0,sizeof(v));
if(tp==1)
{
for(at[0]=bt[0]=1,i=1;i<=D;i++)
at[i]=at[i-1]*a,bt[i]=bt[i-1]*b;
for(i=1;i<=D;i+=2)
{
f=(i%4==1)?1:-1;
for(j=0;j<=i;j++)
v[j]+=f*at[j]*bt[i-j]*y[i][j]/jc[i];
}
}
else if(tp==2)//这里枚举的是2i+1
{
for(at[0]=bt[0]=1,i=1;i<=D;i++)
at[i]=at[i-1]*a,bt[i]=bt[i-1]*b;
for(i=0;i<=D;i++)
for(j=0;j<=i;j++)
v[j]+=at[j]*bt[i-j]*y[i][j]/jc[i];
}
else
v[0]=b,v[1]=a;
}
}t[N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
bool srt(int x)
{
return t[t[x].f].c[0]!=x&&t[t[x].f].c[1]!=x;
}
void ud(int x)
{
for(int i=0;i<=D;i++)
t[x].s[i]=t[t[x].c[0]].s[i]+t[t[x].c[1]].s[i]+t[x].v[i];
t[x].sz=t[t[x].c[0]].sz+t[t[x].c[1]].sz+1;
}
void pd(int x)
{
if(t[x].lz)
{
t[x].lz=0;
t[t[x].c[0]].lz^=1;
t[t[x].c[1]].lz^=1;
swap(t[x].c[0],t[x].c[1]);
}
}
void updata(int x)
{
if(!srt(x)) updata(t[x].f);
pd(x);
}
void zhuan(int x)
{
int l,r,y=t[x].f,z=t[y].f;
if(t[y].c[0]==x)
l=0;
else
l=1;
r=l^1;
if(!srt(y))
{
if(t[z].c[0]==y)
t[z].c[0]=x;
else
t[z].c[1]=x;
}
t[x].f=z;t[y].f=x;
t[t[x].c[r]].f=y;
t[y].c[l]=t[x].c[r];
t[x].c[r]=y;
ud(y);// ud(x);
}
void splay(int x)
{//cout<<"splay"<<x<<endl;
top=0;
st[++top]=x;
for(int i=x;!srt(i);i=t[i].f)
st[++top]=t[i].f;
while(top)
pd(st[top--]);
while(!srt(x))
{
int y=t[x].f,z=t[y].f;
if(!srt(y))
{
if((t[y].c[0]==x)^(t[z].c[0]==y))
zhuan(x);
// else
// zhuan(y);
}
zhuan(x);
}
ud(x);
}
void acc(int x)
{//cout<<"acc"<<x<<endl;
for(int i=0;x;i=x,x=t[x].f)
{//cout<<"foracc"<<x<<endl;
splay(x);
t[x].c[1]=i;
ud(x);
}
}
int zhao(int x)
{
while(t[x].f)
x=t[x].f;
return x;
acc(x);
}
void mkrt(int x)
{
acc(x);
splay(x);
t[x].lz^=1;
}
void lk(int x,int y)
{
mkrt(x);
t[x].f=y;
}
void ct(int x,int y)
{//cout<<x<<" "<<y<<endl;
mkrt(x);
acc(y);
splay(y);
if(t[y].c[0]!=x)
return;
t[x].f=0;
t[y].c[0]=0;
ud(y);
}
int main()
{
// n=read(),m=read();
scanf("%d%d%s",&n,&m,s);
jc[0]=1;
for(int i=1;i<=D;i++)
jc[i]=jc[i-1]*i;
y[0][0]=1;
for(int i=1;i<=D;i++)
{
y[i][0]=1;
for(int j=1;j<=D;j++)
y[i][j]=y[i-1][j-1]+y[i-1][j];
}
for(int i=1;i<=n;i++)
{
// t[i].tp=read();
scanf("%d%lf%lf",&t[i].tp,&t[i].a,&t[i].b);
t[i].tl();
ud(i);
}
while(m--)
{
scanf("%s",s);
if(s[0]=='a')
{
// int a=read()+1,b=read()+1;
int a,b;
scanf("%d%d",&a,&b);
lk(a+1,b+1);
}
else if(s[0]=='d')
{
// int a=read()+1,b=read()+1;
int a,b;
scanf("%d%d",&a,&b);
ct(a+1,b+1);
}
else if(s[0]=='m')
{
// int a=read()+1;
int a;
scanf("%d",&a);
a++;
splay(a);
// t[a].tp=read();
scanf("%d%lf%lf",&t[a].tp,&t[a].a,&t[a].b);
t[a].tl();
ud(a);
}
else
{
// int a=read()+1,b=read()+1;
int a,b;
double x,y,ans;
scanf("%d%d%lf",&a,&b,&x);
a++,b++;
if(zhao(a)!=zhao(b))
{
puts("unreachable");
continue;
}
y=1,ans=0;
mkrt(a);
acc(b);
splay(b);
for(int j=0;j<=D;j++,y*=x)
ans+=y*t[b].s[j];
printf("%.8le\n",ans);
}
}
return 0;
}

bzoj 5020: [THUWC 2017]在美妙的数学王国中畅游【泰勒展开+LCT】的更多相关文章

  1. 【BZOJ5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT

    [BZOJ5020][THUWC 2017]在美妙的数学王国中畅游 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙的进程, 这些神秘而又美妙的过程无不可以用数 ...

  2. 5020: [THUWC 2017]在美妙的数学王国中畅游

    传送门 当年听llj讲的时候觉得这简直是个不可做的神题. 现在看来并不是很神,可能是我已经被剧透了的缘故... 一开始以为是函数套函数,懵蔽了好久,结果只是求和 被剧透了泰勒展开就比较水了..只要你不 ...

  3. BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)

    Description 数字和数学规律主宰着这个世界.   机器的运转,   生命的消长,   宇宙的进程,   这些神秘而又美妙的过程无不可以用数学的语言展现出来.   这印证了一句古老的名言:   ...

  4. bzoj5020: [THUWC 2017]在美妙的数学王国中畅游

    Description 数学王国中,每个人的智商可以用一个属于 [0,1]的实数表示.数学王国中有 n 个城市,编号从 0 到 n−1 ,这些城市由若干座魔法桥连接.每个城市的中心都有一个魔法球,每个 ...

  5. bzoj 5020(洛谷4546) [THUWC 2017]在美妙的数学王国中畅游——LCT+泰勒展开

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5020 https://www.luogu.org/problemnew/show/P4546 ...

  6. 解题:THUWC 2017 在美妙的数学王国中畅游

    题面 _“数字和数学规律主宰着这个世界.”_ 在 @i207M 帮助下折腾了半天终于搞懂了导数和泰勒展开,引用某学长在考场上的感受:感觉整个人都泰勒展开了 显然是个奇奇怪怪的东西套上LCT,发现直接维 ...

  7. bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5020 https://loj.ac/problem/2289 题解 这个 appear 和 d ...

  8. [THUWC 2017]在美妙的数学王国中畅游

    bzoj5020 \[答案误差只要小于 10^{-7}\] 题解 Taylor展开式: \[若f(x)的n阶导数在[a, b]内连续,则f(x)在x_{0}\in[a, b]可表示为\] \[f(x) ...

  9. BZOJ5020 [THUWC 2017]在美妙的数学王国中畅游LCT

    题意很明显是要用LCT来维护森林 难点在于如何处理函数之间的关系 我们可以根据题目给的提示关于泰勒展开的式子 将三种函数变成泰勒展开的形式 因为$x∈[0,1]$ 所以我们可以将三个函数在$x_0=0 ...

随机推荐

  1. HTML5 FileReader接口学习笔记

    1.FileReader概述 FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据. 其中F ...

  2. DPDK的代码规范

    每个公司都会有自己代码风格或者编程规范,都旨在防范编程语言的一些陷阱或者提高代码效率,还有就是保持一致编码风格来提高代码可读性,方便code review: 或者说代码的一种美学,比如python也就 ...

  3. json字符串数组判断其中

    嘴挺笨的描述不清,直接看图,console.log(data1)是下图 获取的table中的数据组成的json对象(这里我不明白json对象啊json字符串啊json数组啊.我只会- 需要啥就转换成啥 ...

  4. SVN基本介绍

    SVN是一种项目合作开发的软件,参与项目的人员可以在不同的地方实现文件和目录的超时空共享. 两个重要的概念: 1.配置库(Repository) SVN的核心是配置库,储存所有的数据,配置库按照文件树 ...

  5. mysql常见面试题目

    1, mysql的复制原理以及流程. (1)先问基本原理流程,3个线程以及之间的关联. (2)再问一致性,延时性,数据恢复. (3)再问各种工作遇到的复制bug的解决方法 2,mysql中myisam ...

  6. 虚拟机——mnt_hgfs下无目录情况解决

    /mnt/hgfs下无目录情况解决: VMware8虚拟机安装Ubuntu 11.10使用share folders共享目录将虚拟机掉电关闭(不能暂停),设置share folders目录,重启虚拟机 ...

  7. Printed Circuit Board (board)

    Printed Circuit Board (board) 题目描述 给出一个N个顶点的简单多边形,对于每个顶点,假如它和原点连成的线段只在这个顶点处和多边形相交,就称为满足要求的顶点.你的任务是输出 ...

  8. 【CZY选讲·最大子矩阵和】

    题目描述 有一个n*m的矩阵,恰好改变其中一个数变成给定的常数P,使得改变后的这个矩阵的最大子矩阵最大. 数据范围 n,m<=300. 题解:    ①如果没有p,那么二维矩阵和就是一维最长 ...

  9. 【马克-to-win】学习笔记—— 第五章 异常Exception

    第五章 异常Exception [学习笔记] [参考:JDK中文(类 Exception)] java.lang.Object java.lang.Throwable java.lang.Except ...

  10. linux fg bg ctrl + z jobs & 等命令

    fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的一.& 最经常被用到这个用在一个命令的最后,可以把这个命令放到 ...