题目大意:猫中生猫。每一只猫里有N只猫。但是产生的N只小猫总高度只有N/(N+1)。已知最大猫高度和最小猫数量,求除最小猫以外的猫的总数和所有猫的总高度。
公式推导如图。
几个注意点:
1.比较对数要更精细。1e-6不够,1e-10才够。
2.最后达成的totH这个公式里吧,要算(N/(N+1))^k,分母分子分开就会炸。
3.参考大神的算法。N和k取double型更方便好算一些,转整数要int(x+0.5)。
不难理解也不难推。
但是细节搞到死。
一边吃某小鲜肉的瓜一边搞了一下午才搞出来。
哇擦擦列。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int N,k,W,H;
int totH,notW;
double result;
while(scanf(" %d %d",&H,&W)!=EOF)
{
if(W==0&&H==0)break;
for(N=1;N<=W;N++)
{
result=log(W)/log(H)-log(N)/log(N+1);
//cout<<"test"<<N<<" "<<result<<endl;
if(fabs(result)<1e-10)break;
}
k=int(log(H)/log(N+1)+0.5);
//cout<<N<<" "<<k<<endl;
if(N==1){notW=k*N;}
else notW=int((pow(N,k)-1)/(N-1)+0.5);
totH=H*(N+1)-int(H*N*pow(1.0*N/(N+1),k)+0.5);
printf("%d %d\n",notW,totH);
}
return 0;
}