题目大意:有一只高 h 的猫,能变出 N 只高 h/(N+1) 的猫,这些猫又能变出 N 只高度为 h/(N+1)^2 的猫……直到猫的高度为 1,这些高度为 1 的猫共有 n 只,它们不得不工作。题目给出 h 和 n 求不需要工作的猫(除了高度为 1 的猫)和所有猫的高度总和。
解题思路:假设分裂 k 次,则高度为 h(1/(N+1))^k = 1。分裂第 k 次时,分裂除的个数为 N^k。可以得到等式 k = log(h)/log(N+1) = log(n)/log(N),枚举 N,求得 k,然后相加就行。注意精度,用1e-10去调节。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
int main() {
int h, n;
while (scanf("%d%d", &h, &n) != EOF) {
if (h == 0 && n == 0) break;
int N = 1;
while (fabs(log(h)/log(N+1) - log(n)/log(N)) > 1e-10) N++;
int k = log(h)/log(N+1) + 1e-10;
long long no_work = 1;
long long tot_high = h;
long long num = 1;
long long high = h;
for (int i = 1; i <= k; i++) {
num *= N;
h = h / (N+1);
no_work += num;
tot_high += h * num;
}
printf("%lld %lld\n", no_work-n, tot_high);
}
return 0;
}