BNU Online Judge-34976-数细菌

题目链接

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\n",s);
}
return 0;
}

posted @ 2014-10-04 21:15  立刻行动  阅读(181)  评论(0编辑  收藏  举报