【BestCoder】【Round#29】

时间:2022-03-28 14:46:30

T1

  啊……a^b 与 c^d比较大小,我们可以两边取对数,转化成 log(a^b)=b*log(a) 和d*log(c)

  这样就能直接算了……然后稍微搞一下精度什么的就A了=。=

 //BC #29
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
const double eps=1e-;
int dcmp(double x){
if (fabs(x)<eps) return ; else return x< ? - : ;
}
int main(){
int a,b,c,d;
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){
double x=b*log(a),y=d*log(c);
int z=dcmp(x-y);
if (z==) puts("=");
else if(z==) puts(">");
else puts("<");
}
return ;
}

T2

  很明显是每次找出最大的两个然后加起来……就是fibnacci数列的样子啦~那么就是所有的a[i]加起来,减去最大的两个数的值,再加上fib的前k+1项和。

  我们记第二大的数为a,第一大的数为b,则:

  fib        a           b             a+b           a+2b        2a+3b           3a+5b……

  sum     a          a+b      2a+2b       3a+4b  ……………………………………

  可以发现,sum[i]=fib[i+2]-b!!所以求sum也就跟求fib一样了,矩阵快速幂搞一搞就可以