HDU 6424 Rikka with Time Complexity

题目:
HDU 6424 Rikka with Time Complexity

题意:
定义f(A) = log log log log …. (A个log) n ,g[A,B,C] = f(A)^( f(B) ^ f(C) )
现在给定a, b两数组,数组大小最大为3,请计算当n趋向于无穷时,g[a1,a2…] / g[b1…]的值为无穷大或者是无穷小或者是某一个常数?对应输出 1, -1, 0

思路:
这是一道纯粹的数学题(数学差我能怎么办,我也很绝望啊)
首先要知道一个知识点就是f(+∞) ~ 1,意思是这两者是等价无穷小
然后对于f(A)^( f(B) ^ f(C) ),我们现在需要把指数换到前面来,在最前面加个log得到

log f(A) ^ ( f(B) ^ f(C) )
= ( f(B) ^ f(C) ) log f(A)
= ( f(B) ^ f(C) ) * f(A + 1)

可以看到,已经把一个指数提前了了,但是还有一个指数,因此再来一个log

log [( f(B) ^ f(C) ) * f(A + 1)]
= log ( f(B) ^ f(C) ) + log f(A + 1)
= f(C) log f(B) + log f(A + 1)
= f(C)f(B + 1) + f (A + 2) f(+∞)

接着就是对比f(A3)f(A2 + 1) 和 f (A1 + 2) f(+∞) 哪个大,大的去跟B数组对应的式子中较大者进行比较,若是相等则比较较小者,若仍然相等则输出0

AC代码:

#include <bits/stdc++.h>

using namespace std;

struct node
{
    int x, y;
    node(){}
    node(int xx, int yy)
    {
        x = min(xx, yy), y = max(xx, yy);
    }
};

bool cmp(node a, node b)
{
    if(a.x != b.x)  return a.x < b.x;
    return a.y < b.y;
}

int main()
{
    int T;
    for(scanf("%d", &T); T ; T --)
    {
        int a[2][3], n, m;
        memset(a, 0x3f, sizeof a);
        scanf("%d%d", &n, &m);
        for(int i = 0; i < n; i ++) scanf("%d", a[0] + i);
        for(int j = 0; j < m; j ++) scanf("%d", a[1] + j);
        node t1, t2, t3, t4;
        t1 = node(a[0][0] + 2, 0x3f3f3f3f);
        t2 = node(a[0][1] + 1, a[0][2]);
        t3 = node(a[1][0] + 2, 0x3f3f3f3f);
        t4 = node(a[1][1] + 1, a[1][2]);
        if(cmp(t2, t1))         swap(t1, t2);
        if(cmp(t4, t3))         swap(t4, t3);
        if(cmp(t1, t3))         puts("1");
        else if(cmp(t3, t1))    puts("-1");
        else if(cmp(t2, t4))    puts("1");
        else if(cmp(t4, t2))    puts("-1");
        else                    puts("0");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_38287798/article/details/81941525