猴子分蘋果

AC_no error發表於2020-10-15

題目:

先來看一道題:

有5只猴子在海邊發現一堆桃子,決定第二天來平分.第二天清晨,第一隻猴子最早來到,它左分右分分不開,就朝海里扔了一隻,恰好可以分成5份,它拿上自己的一份走了.第2,3,4,5只猴子也遇到同樣的問題,採用了同樣的方法,都是扔掉一隻後,恰好可以分成5份.問這堆桃子至少有多少隻?

思路: 

先給這些猴子4個桃子,  

第1只猴子多了4個桃子正好分成五份,拿走自己的部分(一堆多1個,給他的4個桃子留給第二個猴子);    

第2只猴子多了4個桃子正好分成五份,拿走自己的部分(一堆多1個,給他的4個桃子留給第三個猴子);  

…………………

第5只猴子多了4個桃子正好分成五份,拿走自己的部分;    

這就是說,有了這4個桃子,每次猴子都可以平均分成5份,可見,原來的總數必須是5的5次方的倍數,即3125,所以原來有3121個。

先給四個的目的是湊整,這樣就當做扔掉的也被第一個拿走了,這樣每次都可以除盡。5只猴子需要除盡五次,所以需要5^5次方。那麼可列式x+4=5^5解決。

在這裡,每隻猴子都取剩下的m個蘋果和平分的那些,不妨令每隻猴子拿走了這樣,這樣的話先新增(n-1)*m個蘋果,這樣雖然第一隻猴子拿掉了m+x/n個蘋果,但是預先給的沒有拿走,對於第二隻猴子仍然滿足平分,n只猴子平分完還可以再平分,也就是n^(n+1),所以可列式x+(n-1)*m=n^(n+1);

程式碼:

#include<algorithm>

#include<iostream>

#include<cstring>

#include<string>

#include<cstdlib>

#include<map>

#include<cmath>

#include<vector>



using namespace std;

typedef long long ll;

const int maxn = 1e6+50;



int main(){

            ll n,m;

            cin >> n >> m;

            ll ans = pow(n,n+1)-(n-1)*m;

            cout << ans << endl;

            return 0;

}

 

相關文章