猴子分苹果

Posted coolcpp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猴子分苹果相关的知识,希望对你有一定的参考价值。

问题描述

秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分。这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果。第一只猴子悄悄来到山洞,把苹果平均分成n份,把剩下的m个苹果吃了,然后藏起来一份,最后把剩下的苹果重新合在一起。这些猴子依次悄悄来到山洞,都做同样的操作,恰好每次都剩下了m个苹果。第二天,这些猴子来到山洞,把剩下的苹果分成n分,巧了,还是剩下了m个。问,原来这些猴子至少采了多少个苹果。

输入格式

两个整数,n m

输出格式

一个整数,表示原来苹果的数目

样例输入

5 1

样例输出

15621

数据规模和约定

0<m<n<9



分析思路

1.正向思维

猴子为n只,每次要余下m个苹果。则苹果最少为n+m个,苹果每次增加n个。如:
n = 5, m = 1。则苹果最少为6,它的可能值为6, 11, 16, 21, 26.....

这样便可从最少的苹果数开始依次递增,每个猴子要对苹果操作一次,操作都为:
苹果数 / 猴子数 - 余数。若一只猴子实行平分操作后苹果数不剩下m,则此非要求苹果数,继续增加下一个可能的苹果数。直到满足则跳出循环, 再判断看此数是否还是余1,是则是正确答案,输出。

2.递推思维

还可以从后往前想,苹果和猴子的数量相等时苹果最少。苹果被分了n+1次,吃了n次,最后还剩下m个。

因此,可以得到公式:
苹果总数 = n ^ (n + 1) - n * m + m



实现代码

//1. 正向思维

#include <iostream>

int main()
{
    int n, m;
    std::cin >> n >> m;
    
    for(int j = n + m; ; j += n)
    {
        int i, sum = j;
        
        for(i = 0; i < n; ++i)
        {
            if(sum % n != m)
                break;
            sum = sum - sum/n - m;
        }
        
        if(i == n && sum % n == m)
        {
            std::cout << j;
            break;
        }
    }
        
    return 0;
}
//2.递推思维

#include <iostream>
#include <cmath>

int main() 
{
    int n, m;
    std::cin >> n >> m;
    std::cout << pow(n, n+1) - n * m + m << std::endl;  
    
    return 0;
}





以上是关于猴子分苹果的主要内容,如果未能解决你的问题,请参考以下文章

5个猴子分桃

经典的猴子分香蕉问题

7-28 猴子选大王(20 分)

猴子分桃问题

猴子分香蕉

JAVA 基础编程练习题41 程序 41 猴子分桃