4.8省选练习
距离省选越来越近了,心态反而更平和了,或许是好事吧
\(T1\)
个人感觉,泰勒展开比较直观
无非让求这个式子
\(\large \sum_{i=1}^m\frac{x}{x+b_i}(x\in[1,2])\)
首先化简一下
\(\large m-\sum_{i=1}^m\frac{b_i}{x+b_i}\)
每次枚举\(m\)项必然得\(TLE\)
发现这个式子带入很麻烦,考虑能否把\(m\)个式子合成一项,由于题目对精度要求不是很高,我们考虑对这个式子\(Taylor\)展开一下,因为每个拆出来之后都是一个多项式形式,就可以处理多项式系数然后直接带入了
我们祭出数学\(whk\)知识,\(Taylor\)级数
题目说了\(x\in[1,2]\)那么我们在\(1.5\)处展开即可,直接预处理多项式系数,带入即可
不会吧不会吧,@Zwaire不会\(Taylor\)展开!!!
考虑\(f(x)\)在\(x_0\)展开
\(\large \sum_{i=0}^\infty\left(\dfrac{f^{(i)}(x_0)}{i!}(x-x_0)^i\right)\)
我们考虑\(\large g(x)=\frac{b_i}{x+b_i}\)展开
给出结论吧
\(\large g^{(i)}(x)=(-1)^i\frac{b_i\times i!}{(x+b_i)^{i+1}}(x-x_0)^i\)
然后我们将\(x=1.5\)带入得到所有系数,直接枚举\((x-x_0)^i\)即可
\(\displaystyle g(x)=\sum_{i=0}^{\infty}(-1)^i\dfrac{b_i}{(x+b_i)^{(i+1)}}(x-x_0)^i\)
#define Eternal_Battle ZXK
#include<bits/stdc++.h>
#define MAXN 1000005
#define MAXK 30
using namespace std;
const double del=1.5;
double a[MAXN],b[MAXN],xs[35];
int n,m;
int main()
{
freopen("owo.in","r",stdin);
freopen("owo.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
for(int i=1;i<=m;i++) scanf("%lf",&b[i]);
for(int i=1;i<=m;i++)
{
double One=1.0,fz=b[i]*1.0,fm=(del+b[i]);
xs[0]+=One*fz/fm;
for(int j=1;j<=MAXK;j++)
{
One*=-1.0;
fm*=(del+b[i]);
xs[j]+=One*fz/fm;
}
}
for(int i=1;i<=n;i++)
{
double One=1.0,res=1.0,Ans=0.0;
Ans+=m;
Ans-=res*xs[0];
for(int j=1;j<=MAXK;j++)
{
res*=(a[i]-del);
Ans-=res*xs[j];
}
printf("%.5f ",Ans);
}
}
\(T2\)
每一维度独立计算之后合并比较显然
考虑我们只需要枚举在各个维度走多少步进行合并
考虑\(dp[i]\)表示走了\(i\)步第一次到的所有方案数
\(dp[i]=(2k)^i-\sum dp[j]\times h[i-j]\)
就是所有的\(i\)不方案减去原来第一次方案又走回来的方案数
\(h\)直接背包即可
\(h[now][i]+=h[now-1][j]\times C(2\times (i-j),i-j)\times C(2\times i,2\times j)\)
\(T3\)
极像原来那道路径求交题
那么这道题也是按照那个公式
路径求交公式
\((s[x],s[y])\)设为\(1,2\)
\((t[x],t[y])\)设为\(3,4\)
\(jd1=LCA(1,2)\ xor \ LCA(1,3)\ xor \ LCA(2,3)\)
\(jd2=LCA(1,2)\ xor \ LCA(1,4)\ xor \ LCA(2,4)\)
然后判断一下就好了