题目:
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;
}