题意:一只神奇聪明猫走进了一间乱七八糟的房间,他不想自己动手收拾,他决定要找帮手来工作。于是他从他的帽子中变出了N只小猫来帮他(变出来的猫,高度為原来猫的 1/(N+1) )。这些小猫也有帽子,所以每一隻小猫又从他的帽子中变出N隻小小猫来帮他。如此一直下去,直到这些小小小....猫小到不能再小(高度=1),他们的帽子无法再变出更小的猫来帮忙,而这些最小的猫只得动手打扫房间。注意:所有猫的高度都是正整数。
在这个问题中,给你一开始那隻猫的高度,以及最后动手工作的猫的数目(也就是高度為1的猫的数目)。要请你求出有多少隻猫是没有在工作的,以及所有猫的高度的总和。
The Input
每组测试资料一列,有2个正整数分别代表一开始那隻猫的高度,以及最后动手工作的猫的数目。0 0代表输入结束。
The Output
每组测试资料输出一列,包含2个正整数分别代表有多少隻猫是没有在工作的,以及所有猫的高度的总和。
思路:假设K次分裂后,便有logN(M) = K , N^K = M ,这样便可消去K,然后枚举N ,接下来的便是简单的等比数列求和了 ,自己推一推也就出来了,值得注意的是double 的精度问题。。。。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double H,M,N,K;
while (cin>>H>>M)
{
if ( H == 0 || M == 0)
break;
N = 1 ;
while (abs( log(N)/log(N+1) - log(M)/log(H) ) > 1e-10)
N++;
K = (int)(0.5+log(H)/log(N+1));
if ( N == 1 )
cout<<K;
else cout<<(int)(0.5+ (1-pow(N,K))/(1-N));
cout<<' '<<int(0.5+ (1-pow(N/(N+1),K+1)) * (N+1) *H ) <<endl;
}
return 0;
}