题意:
给你两个式子,求其趋近于x时候的比值。
思路:
如果两个式子的值都为0,则按照洛必达定理,求导以后比值不变。
所以一直求导知道两个式子不全为0,之后就是模拟了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
const int maxn = 4e5 + 7;
char s[maxn];
vector<pair<ll,ll> >G1,G2;
void get(vector<pair<ll,ll> >&vec) {
int n = strlen(s + 1);
int sta = 0;
s[0] = '+';
if(s[1] == '-') {
sta = 1;
}
for(int i = sta;i <= n;i++) {
if(s[i] == '+' || s[i] == '-') {
int flag = 0;
if(s[i] == '+') flag = 1;
else flag = -1;
int pos = -1;
int c = flag,p = 1;
for(int j = i + 1;j <= n;j++) {
if(s[j] == 'x') {
pos = j;break;
} else if(s[j] == '-' || s[j] == '+') {
break;
}
}
if(pos != -1) {
if(s[pos - 1] <= '9' && s[pos - 1] >= '0') {
c *= (s[pos - 1] - '0');
}
if(s[pos + 1] == '^') {
p = s[pos + 2] - '0';
}
} else {
c *= (s[i + 1] - '0');
p = 0;
}
vec.push_back({
c,p});
}
}
}
ll qpow(ll x,ll n) {
ll res = 1;
for(int i = 1;i <= n;i++) {
res = res * x;
}
return res;
}
void Deri(vector<pair<ll,ll>>&vec) {
for(int i = 0;i < vec.size();i++) {
if(vec[i].second == 0) {
vec[i].first = 0;
continue;
}
vec[i].first *= vec[i].second;
vec[i].second --;
}
}
ll cal(vector<pair<ll,ll> >vec,int x) {
ll res = 0;
for(int i = 0;i < vec.size();i++) {
res = res + 1ll * vec[i].first * qpow(x,vec[i].second);
}
return res;
}
ll gcd(ll n,ll m) {
return m == 0 ? n : gcd(m,n % m);
}
int main() {
int T;scanf("%d",&T);
while(T--) {
G1.clear();
G2.clear();
scanf("%s",s + 1);
get(G1);
scanf("%s",s + 1);
get(G2);
// for(int i = 0;i < G1.size();i++) {
// printf("%d %d\n",G1[i].first,G1[i].second);
// }
// printf("\n");
// for(int i = 0;i < G2.size();i++) {
// printf("%d %d\n",G2[i].first,G2[i].second);
// }
int x;scanf("%d",&x);
for(int i = 1;i <= 10;i++) {
ll num1 = cal(G1,x);
ll num2 = cal(G2,x);
if(!num1 && !num2) {
Deri(G1);
Deri(G2);
} else {
if(num1 && num2) {
ll tmp = gcd(num1,num2);
num1 /= tmp;
num2 /= tmp;
if(num2 < 0) {
num1 *= -1;
num2 *= -1;
}
printf("%lld",num1);
if(num2 != 1) {
printf("/%lld",num2);
}
printf("\n");
} else if(!num2) {
printf("INF\n");
} else {
printf("0\n");
}
break;
}
}
}
return 0;
}