题目:
先来看一道题:
有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;
}