题目撞名
题目大意:
给出两个函数 P ( x ) , Q ( x ) P(x),Q(x) P(x),Q(x).
P ( x ) = a 0 × x N + a 1 × x N − 1 + a 2 × x N − 2 ⋯ a N − 1 × x + a N P(x)=a_0 \times x^N+a_1 \times x^{N-1}+a_2 \times x^{N-2} \cdots a_{N-1} \times x+a_N P(x)=a0×xN+a1×xN−1+a2×xN−2⋯aN−1×x+aN
Q ( x ) = b 0 × x M + b 1 × x M − 1 + b 2 × x M − 2 ⋯ b M − 1 × x + b M Q(x)=b_0 \times x^M+b_1 \times x^{M-1}+b_2 \times x^{M-2} \cdots b_{M-1} \times x+b_M Q(x)=b0×xM+b1×xM−1+b2×xM−2⋯bM−1×x+bM
计算 lim x → + ∞ P ( x ) Q ( x ) \lim_{x \to +\infty}\frac{P(x)}{Q(x)} limx→+∞Q(x)P(x)
分析
先看一下极限的定义:设函数
f
(
x
)
f(x)
f(x) 在点
x
0
x_0
x0 的某一去心邻域内有定义,如果存在常数
a
a
a,
∀
ε
∈
N
\forall \varepsilon \in \mathbb{N}
∀ε∈N,
∃
δ
>
0
\exists \delta>0
∃δ>0,使不等式
∣
f
(
x
)
−
a
∣
<
ε
|f(x)-a|<\varepsilon
∣f(x)−a∣<ε,在
∣
x
−
x
0
∣
∈
(
0
,
δ
)
|x-x_0|\in(0,\delta)
∣x−x0∣∈(0,δ) 时恒成立,那么常数
a
a
a 就叫做函数
f
(
x
)
f(x)
f(x) 当
x
→
x
0
x \to x_0
x→x0 时的极限,记作
lim
x
→
x
0
f
(
x
)
=
a
\lim_{x \to x_0}f(x)=a
limx→x0f(x)=a.(根本就不是人话)
定义非常简(kan)单(bu)明(dong)了,于是肯定会有人会用一种非常简单粗暴的方法去解决这道题,将一个非常大的数带入,然后计算,答案取一个近似值,那么问题来了,需要带怎样的一个数进去呢,又如何计算呢.所以这个方法显然就是错误的,那么就要从这两个函数入手了,可以发现 lim x → + ∞ P ( x ) a 0 × x N = 1 \lim_{x \to +\infty}\frac{P(x)}{a_0 \times x^N}=1 limx→+∞a0×xNP(x)=1 具体证明见洛必达法则,所以当 x → + ∞ x \to +\infty x→+∞ 时, P ( x ) = a 0 × x N P(x)=a_0 \times x^N P(x)=a0×xN, Q ( x ) = b 0 × x M Q(x)=b_0 \times x^M Q(x)=b0×xM,所以就直接取比较这两个值就好了.当 N > M N>M N>M时结果为 + ∞ +\infty +∞ 或 − ∞ -\infty −∞,结果与 a 0 a_0 a0 和 b 0 b_0 b0 的正负性有关,如果 a 0 ∗ b 0 > 0 a_0*b_0>0 a0∗b0>0 结果为 + ∞ +\infty +∞,反之为 − ∞ -\infty −∞.如果 N < M N<M N<M 时结果为 0 0 0,当 N = M N=M N=M 时结果自然就是 a 0 b 0 \frac{a_0}{b_0} b0a0 了.
代码
#include<bits/stdc++.h>
#define REP(i,first,last) for(int i=first;i<=last;++i)
#define DOW(i,first,last) for(int i=first;i>=last;--i)
using namespace std;
int N,M;
int a0,b0;//只要记录a0和b0
int Gcd(int a,int b)//需要约分
{
if(!b)
{
return a;
}
return Gcd(b,a%b);
}
int main()
{
scanf("%d%d",&N,&M);
int air;//没用的值
scanf("%d",&a0);
REP(i,1,N)
{
scanf("%d",&air);
}
scanf("%d",&b0);
REP(i,1,M)
{
scanf("%d",&air);
}
if(N<M)//如果N<M时最后的答案为0
{
printf("0/1");
return 0;
}
if(a0*b0<0)//如果a0*b0<时需要输出符号
{
printf("-");
a0=abs(a0);
b0=abs(b0);
}
if(N>M)//如果N>M时最终的结果为无穷大
{
printf("Infinity");
return 0;
}
int gcd=Gcd(a0,b0);//约分
a0/=gcd;
b0/=gcd;
printf("%d/%d",a0,b0);//输出答案
return 0;
}