码迷,mamicode.com
首页 > 移动开发 > 详细

猴子分苹果

时间:2018-07-22 15:19:21      阅读:277      评论:0      收藏:0      [点我收藏+]

标签:总数   bre   ret   正确答案   判断   要求   mat   递增   out   

问题描述

秋天到了,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;
}

猴子分苹果

标签:总数   bre   ret   正确答案   判断   要求   mat   递增   out   

原文地址:https://www.cnblogs.com/coolcpp/p/monkey-apple.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!