G Limit 题解(泰勒展开)

题面

这题目要到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;
}

不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/15503898.html