思路
给出 a i a_i ai , b i b_i bi , t t t,要求 l i m i → 0 ∑ i = 1 n a i l n ( 1 + b i x ) x t lim_{i \to 0}\frac{\sum^n_{i=1}a_i ln(1+b_ix)}{x^t} limi→0xt∑i=1nailn(1+bix). 将分子泰勒展开为多项式的形式,分子分母就可以约分了。
f ( x ) = f ( x 0 ) 0 ! ( x − x 0 ) 0 + f ′ ( x 0 ) 1 ! ( x − x 0 ) 1 + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + ⋯ + f ( n ) ( x 0 ) n ! ( x − x 0 ) n f(x)=\frac{f(x_0)}{0!}(x-x_0)^0+\frac{f'(x_0)}{1!}(x-x_0)^1+\frac{f''(x_0)}{2!}(x-x_0)^2+ \dots +\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n f(x)=0!f(x0)(x−x0)0+1!f′(x0)(x−x0)1+2!f′′(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)n
将 x 0 = 0 x_0=0 x0=0 , f ( x ) = a l n ( 1 + b x ) f(x)=aln(1+bx) f(x)=aln(1+bx) 带入得: x − x 2 2 + x 3 3 + ⋯ + ( − 1 ) n + 1 x n n x-\frac{x^2}{2}+\frac{x^3}{3}+ \dots +(-1)^{n+1}\frac{x^n}{n} x−2x2+3x3+⋯+(−1)n+1nxn
设所有的 a l n ( 1 + b x ) aln(1+bx) aln(1+bx) 第 i i i 项的系数之和为 f i f_i fi ,那么原式就转化为: f 1 x + f 2 x 2 + ⋯ + f n x n x t \frac{ f_1x+f_2x^2+\dots+f_nx^n}{x^t} xtf1x+f2x2+⋯+fnxn(展开 [ 0 , 5 ] [0,5] [0,5] 六项即可).
当
f
[
i
]
f[i]
f[i] (
i
<
t
i<t
i<t )不为
0
0
0 时,拆开后会有
x
x
x 出现在分母上,答案为正无穷。
当
f
[
i
]
f[i]
f[i] (
i
<
t
i<t
i<t )全为
0
0
0 时,拆开后
x
x
x 只会出现在分子上,答案为
f
[
i
]
f[i]
f[i]。
第 0 0 0 项的系数恒为 0 0 0 ,当 t = 0 t=0 t=0 时,答案为 0 0 0 .
代码中计算系数的时候没有除分母,避免产生浮点数,当最后输出的时候再处理分母。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,t,a,b,f[10];
void taile(int a,int b){
for(int i=1;i<=5;i++)
f[i]+=pow(-1,i+1)*a*pow(b,i);
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>t;
for(int i=1;i<=n;i++) cin>>a>>b,taile(a,b);
for(int i=1;i<t;i++)
if(f[i]!=0){ cout<<"infinity\n"; return 0; }
if(t==0){ cout<<"0\n"; return 0; }
int fz=f[t],fm=t;
int gcd=__gcd(fz,fm);
fz/=gcd,fm/=gcd;
if(fm<0) fz=-fz,fm=-fm;
if(fm==1) cout<<fz<<"\n";
else cout<<fz<<"/"<<fm<<"\n";
}