zoukankan      html  css  js  c++  java
  • 「模拟赛20190329」作业 泰勒展开

    题目描述

    小W的数学老师总是喜欢布置计算题作为业,小W却只对证明题感兴趣。
    这一次,小W的数学老师布置了一道计算题:
    已知递推公式
    (f_n=1-nf_{n-1}(n>0))
    (f_0=1-e)
    对于老师给定的(n),小W需要计算(f_n)。小W认为这个作业非常简单而且无聊,所以他找到了你,希望你能帮助他完成这道作业题。

    输入

    第一行一个整数(n),表示给定的(n)

    输出

    一行一个浮点数表示答案,保留(4)位小数。

    样例

    样例输入

    #样例1
    0
    #样例2
    2
    

    样例输出

    #样例1
    0.6321
    #样例2
    0.2642
    

    数据范围

    对于(10\%)的数据(n<=10)
    对于(100\%)的数据满足(n<=10000)

    题解

    真·数学题。

    解法(1)
    (10)个暴算,(11-50)二分答案用(f_{n-1}=frac{1-f_n}{n})验证。更大的算近似值(f_napproxfrac{1}{n+2})

    解法(2)
    (Orz),跪膜(Freopen)大爷。
    (frac{1}{e})泰勒展开变成(sum(-1)^ncdot frac{1}{n!})
    (f_n)变成非递推形式,这一步很好想:

    [f_n=sum_{i=0}^{n}(-1)^{n-i}cdotfrac{n!}{i!}-(-1)^ncdot n!cdotfrac{1}{e} ]

    (frac{1}{e})带入进去,注意(frac{1}{e})展开后是有无穷项的。

    [f_n=sum_{i=0}^{n}(-1)^{n-i}cdotfrac{n!}{i!}-sum_{i=0}(-1)^{n+i}cdot frac{n!}{i!} ]

    因为(n-i)(n+i)的奇偶性是相同的,我们可以前后抵消一大坨

    [f_n=sum_{i=n+1}(-1)^{n+i}cdotfrac{n!}{i!}=sum_{i=1}(-1)^{i}cdotfrac{n!}{(n+i)!} ]

    发现(frac{n!}{(n+i)!})必定小于(1),而且是在做除法,精度不会流失,那么我们就可以枚举(i),直到某一项小于(eps)之后就停止,由于是以阶乘的速度减小,所以只需要枚举几项就可以了。

    代码采取的是第二种方法。

    (Code:)

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define eps 1e-6
    int n;
    double ans, now;
    int main()
    {
    	scanf("%d", &n);
    	now = 1;
    	for (int i = 1; now >= eps; i++)
    	{
    		now = now / (n + i);
    		if (i & 1)
    			ans += now;
    		else
    			ans -= now;
    	}
    	printf("%.4f
    ", ans);
    }
    
  • 相关阅读:
    ReentrantLock与synchronized的差别
    读TIJ -1 对象入门
    wikioi 2573 大顶堆与小顶堆并用
    开源 免费 java CMS
    UVA10972
    springboot5
    spring-boot4
    spring-boot3
    spring-boot2
    spring-boot1
  • 原文地址:https://www.cnblogs.com/ModestStarlight/p/10624193.html
Copyright © 2011-2022 走看看