首页 > 技术文章 > G Limit 题解(泰勒展开)

hunxuewangzi 2021-11-03 15:41 原文

题面

这题目要到pta写,还要购买真有点毒瘤

题目思路

这个题目最好的写法是泰勒展开然而我只会洛必达...

回以一下部分的高数知识

对于有商的求导公式 [f(x)/g(x)]'=[f'(x)g(x)-f(x)g'(x)]/[g(x)]^2。

泰勒展开即为

而现在是要知道\(ln(1+x)\)的泰勒为

\(ln(1+x)=x-x^2/2+x^3/3-x^4/4+.......+(-1)^(n-1)x^n/n+O(x^{(n+1)})\)

然后再套一下就可以得到答案

代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=2e5+5,inf=0x3f3f3f3f,mod=29;
const double eps=1e-6;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n,t;
ll a[maxn],b[maxn];
ll c[10],fac[10];
signed main(){
    scanf("%d%d",&n,&t);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld",&a[i],&b[i]);
        for(int j=1;j<=t;j++){
            if(j%2==1){
                c[j]+=a[i]*qpow(b[i],j);
            }else{
                c[j]-=a[i]*qpow(b[i],j);
            }
        }
    }
    if(t==0){
        printf("0");
        return 0;
    }
    for(int j=1;j<=t;j++){
        if(j==t){
            if(c[j]==0){
                printf("0");
            }else{
                ll g=__gcd(c[j],1ll*j);
                ll zi=c[j]/g;
                ll mu=j/g;
                if(mu<0){
                    zi*=-1;
                    mu*=-1;
                }
                if(mu==1){
                    printf("%lld",zi);
                    break;
                }
                printf("%lld/%lld",zi,mu);
            }
            break;
        }
        if(c[j]!=0){
            printf("infinity");
            break;
        }
    }
    return 0;
}

推荐阅读