HDU 4851 Wow! Such Precision!

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4851

题意:
给定一个非负整数 n n ,请你构造一个n次多项式 f(x) f ( x ) ,使得 10(f(x)ex)2dx ∫ 0 1 ( f ( x ) − e x ) 2 d x 取得最小值。给出 f(x) f ( x ) n+1 n + 1 个项的系数,要求精度误差不超过 1050 10 − 50
0n10 0 ≤ n ≤ 10

题解:
这个 n n 实在是太小了,给人一种可以打表的感觉,于是先来打打表试试!
对于n=0,设 f(x)=c f ( x ) = c ,则

10(f(x)ex)2dx=10(e2x2cex+c2)dx=(e2x22cex+c2x)|10=e2122c(e1)+c2 ∫ 0 1 ( f ( x ) − e x ) 2 d x = ∫ 0 1 ( e 2 x − 2 c e x + c 2 ) d x = ( e 2 x 2 − 2 c e x + c 2 x ) | 0 1 = e 2 − 1 2 − 2 c ( e − 1 ) + c 2

这个函数的极小值点满足导数为 0 0 ,也就是2(e1)+2c=0,即 c=e1 c = e − 1 。可以注意到常数项是不影响答案的。
对于 n=1 n = 1 ,一通强算之后也能得到 f(x)=(186e)x+(4e10) f ( x ) = ( 18 − 6 e ) x + ( 4 e − 10 ) ,然而对于更高的情况就很难强算啦,所以需要一个更形式化的做法。
f(x)=ni=0aixi f ( x ) = ∑ i = 0 n a i ⋅ x i ,那么有
10(f(x)ex)2dx=10(f2(x)2f(x)ex+e2x)dx=i=0nj=0naiaj10xi+jdxi=0n2ai10xiexdx+10e2xdx=i=0nj=0naiaji+j+1i=0n2ai10xiexdx+e212 ∫ 0 1 ( f ( x ) − e x ) 2 d x = ∫ 0 1 ( f 2 ( x ) − 2 f ( x ) e x + e 2 x ) d x = ∑ i = 0 n ∑ j = 0 n a i a j ∫ 0 1 x i + j d x − ∑ i = 0 n 2 a i ∫ 0 1 x i e x d x + ∫ 0 1 e 2 x d x = ∑ i = 0 n ∑ j = 0 n a i a j i + j + 1 − ∑ i = 0 n 2 a i ∫ 0 1 x i e x d x + e 2 − 1 2

注意到这里有一个 10xiexdx ∫ 0 1 x i e x d x 没有化简,考虑分部积分的形式
10xiexdx=(xiex)|10i10xi1exdx=ei10xi1exdx ∫ 0 1 x i e x d x = ( x i e x ) | 0 1 − i ∫ 0 1 x i − 1 e x d x = e − i ∫ 0 1 x i − 1 e x d x

10exdx=e1 ∫ 0 1 e x d x = e − 1 ,所以可以归纳证明 10xiexdx ∫ 0 1 x i e x d x 一定可以被表示成 bie+ci b i e + c i 的形式(因为之间的关系是数乘),则有
{b0=1bi=1ibi1{c0=1ci=ici1 { b 0 = 1 b i = 1 − i ⋅ b i − 1 { c 0 = − 1 c i = − i ⋅ c i − 1

因此积分后的函数就是
i=0nj=0naiaji+j+1i=0n2ai(bie+ci)+e212 ∑ i = 0 n ∑ j = 0 n a i a j i + j + 1 − ∑ i = 0 n 2 a i ( b i e + c i ) + e 2 − 1 2

现在要求这个 (n+1) ( n + 1 ) 元函数的最小值,可以使用拉格朗日乘数法。
L(a0,a1,,an)=ni=0nj=0aiaji+j+1ni=02ai(bie+ci)+e212 L ( a 0 , a 1 , ⋯ , a n ) = ∑ i = 0 n ∑ j = 0 n a i a j i + j + 1 − ∑ i = 0 n 2 a i ( b i e + c i ) + e 2 − 1 2 ,则有偏导 Lai=2nj=0aji+j+1(bie+ci) ∂ L ∂ a i = 2 ∑ j = 0 n a j i + j + 1 − ( b i e + c i )
极小值的点一定是稳定点,且二阶偏导是正定的,一阶偏导等于 0 0 ,于是就有了(n+1)个形如 nj=0aji+j+1=bie+ci ∑ j = 0 n a j i + j + 1 = b i e + c i 的方程。
由于方程未知数的系数是有理数,所以 aj a j 也一定能写成 kje+tj k j e + t j 的形式,于是分别对于 bi b i ci c i 进行一次高斯消元,就可以得到对应的 kj k j tj t j
然而此题要求的精度十分离谱,所以需要更进一步的分析。可以归纳证明 kj k j tj t j 都是整数,但是数字可能大于 109 10 9 ,但不会太大。
于是找两个大素数做模意义下的高斯消元,再用中国剩余定理计算出其实际值即可(需要实际值小于模数)。
不过我找的两个大素数是 1000000007 1000000007 1000000009 1000000009 ,而在 n=10 n = 10 的时候系数已经超过了模数(因为算出的 f(x) f ( x ) 系数居然出现了负数),所以我选择了第三个素数 998244353 998244353 ,得到对应的同余方程组之后,用python做中国剩余定理算出了实际值,大约有 41020 4 ⋅ 10 20 左右,刚好超出 64 64 位整型数的表示范围。
粗略估计为了保证精度,需要 e e 在小数点后70位都是精确的,所以泰勒展开求出一个保留小数点后 70 70 位的值之后,将所有数字乘以 1070 10 70 转化为整数计算,得出每个系数的值,打入表中输出即可。
分析复杂度的话,最大的复杂度部分是 O(n3logn) O ( n 3 l o g n ) 的高斯消元,最后的高精度计算是常数的主要部分。
我是打成字符串后交的C++代码,但是可以使用Java的BigDecimal进行高精度浮点数的运算,会方便许多。

代码:
打表的代码感觉还是不要给了,等研究出Java的写法再补。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值