F - The Limit ZOJ - 3999(模拟,求导)

在这里插入图片描述

题意:
给你两个式子,求其趋近于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;
}

猜你喜欢

转载自blog.csdn.net/tomjobs/article/details/109072757
ZOJ