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;
}
不摆烂了,写题