「CF197B Limit」
题目撞名
题目大意:
给出两个函数 \(P(x),Q(x)\).
\(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\)
\(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\)
计算 \(\lim_{x \to +\infty}\frac{P(x)}{Q(x)}\)
分析
先看一下极限的定义:设函数 \(f(x)\) 在点 \(x_0\) 的某一去心邻域内有定义,如果存在常数 \(a\),\(\forall \varepsilon \in \mathbb{N}\),\(\exists \delta>0\),使不等式\(|f(x)-a|<\varepsilon\),在 \(|x-x_0|\in(0,\delta)\) 时恒成立,那么常数 \(a\) 就叫做函数 \(f(x)\) 当 \(x \to x_0\) 时的极限,记作 \(\lim_{x \to x_0}f(x)=a\).(根本就不是人话)
定义非常简(kan)单(bu)明(dong)了,于是肯定会有人会用一种非常简单粗暴的方法去解决这道题,将一个非常大的数带入,然后计算,答案取一个近似值,那么问题来了,需要带怎样的一个数进去呢,又如何计算呢.所以这个方法显然就是错误的,那么就要从这两个函数入手了,可以发现 \(\lim_{x \to +\infty}\frac{P(x)}{a_0 \times x^N}=1\) 具体证明见洛必达法则,所以当 \(x \to +\infty\) 时,\(P(x)=a_0 \times x^N\),\(Q(x)=b_0 \times x^M\),所以就直接取比较这两个值就好了.当 \(N>M\)时结果为 \(+\infty\) 或 \(-\infty\),结果与 \(a_0\) 和 \(b_0\) 的正负性有关,如果 \(a_0*b_0>0\) 结果为 \(+\infty\),反之为 \(-\infty\).如果 \(N<M\) 时结果为 \(0\),当 \(N=M\) 时结果自然就是 \(\frac{a_0}{b_0}\) 了.
代码
#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;
}