uva 107

题意:一只神奇聪明猫走进了一间乱七八糟的房间,他不想自己动手收拾,他决定要找帮手来工作。于是他从他的帽子中变出了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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值