T1
啊……a^b 与 c^d比较大小,我们可以两边取对数,转化成 log(a^b)=b*log(a) 和d*log(c)
这样就能直接算了……然后稍微搞一下精度什么的就A了=。=
1 //BC #29 2 #include<cmath> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cstring> 6 #include<iostream> 7 #include<algorithm> 8 #define rep(i,n) for(int i=0;i<n;++i) 9 #define F(i,j,n) for(int i=j;i<=n;++i) 10 #define D(i,j,n) for(int i=j;i>=n;--i) 11 using namespace std; 12 const double eps=1e-10; 13 int dcmp(double x){ 14 if (fabs(x)<eps) return 0; else return x<0 ? -1 : 1; 15 } 16 int main(){ 17 int a,b,c,d; 18 while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){ 19 double x=b*log(a),y=d*log(c); 20 int z=dcmp(x-y); 21 if (z==0) puts("="); 22 else if(z==1) puts(">"); 23 else puts("<"); 24 } 25 return 0; 26 }
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一样了,矩阵快速幂搞一搞就可以
View Code