题目链接
http://www.bnuoj.com/bnuoj/problem_show.php?pid=34976
题目分析通过a b可以设x,y
x+y=a x+3*y=b 解出x,y, x=(3*a-b)/2 y=(b-a)/2;
x=(3*a-b)/2; y=(b-a)/2;
n1=(n-1)/2; n2=n/2;
n1 n2 分别为代表3的指数
可以得出结果 s=log10(x*1.0*pow(3.0,n1)+y*1.0*pow(3.0,n2));
如果这样写的话由于a,b,n过大会ni出需要进行变换
因为n1==n2或n2-n1==1可以提出pow(3.0,n1), log10(3的n1次)可改为n1*log10(3);
那么就变成了
if(n1==n2)
{
s=n1*log10(3.0)+log10(x+y);
}
else
{
s=n1*log10(3.0)+log10(x+3*y);
}
这样就达到目的了
代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define ll long long
int main(void)
{
int t;
ll a,b,n,n1,n2;
ll x,y;
scanf("%d",&t);
while(t--)
{
double s=0;
scanf("%lld%lld%lld",&a,&b,&n);
x=(3*a-b)/2; y=(b-a)/2;
n1=(n-1)/2; n2=n/2;
if(n1==n2)
{
s=n1*log10(3.0)+log10(x+y);
}
else
{
s=n1*log10(3.0)+log10(x+3*y);
}
printf("%.10lf
",s);
}
return 0;
}