目录
牛客_猴子分桃(数学推导)
解析代码
直接用数学推导也能推导出来,但比较麻烦,这里有个取巧的方法:
因为每次分5堆都会多出来1个,所以我们借给猴子们4个,以致每次都可以刚好分成5堆 并且,每次给老猴子的桃子都不在我们借出的那4个中,这样最后减掉4就可以得到结果。 假设最初由x个桃子,我们借给猴子4个,则此时有x+4个, 第一个猴子得到(x+4)/5,剩余(x+4)(4/5)个 第二个猴子分完后剩余(x+4) (4/5)^2个 第三个猴子分完后剩余(x+4) (4/5)^3个 依次类推,第n个猴子分完后剩余(x+4)(4/5)^n 要满足最后剩余的为整数,并且x最小,则当 x+4=5^n时,满足要求;此时,x=5^n - 4; 老猴子得到的数量为:x+4)*(4/5)^n + n - 4 = 4^n + n - 4 最后的 +n是因为每个小猴子都会多出一个给老猴子,-4是还了借的4个。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n = 0;
while (cin >> n)
{
if (n == 0)
break;
long total = pow(5, n) - 4;
long left = pow(4, n) + n - 4;
cout << total << " " << left << endl;
}
return 0;
}