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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM