/*
时间限制:3秒
空间限制:32768K
果园里有一堆苹果,一共n头(n大于1小于9)熊来分,第一头为小东,它把苹果均分n份后,多出了一个,它扔掉了这一个,拿走了自己的一份苹果,
接着第二头熊重复这一过程,即先均分n份,扔掉一个然后拿走一份,以此类推直到最后一头熊都是这样(最后一头熊扔掉后可以拿走0个,也算是n份均分)。
问最初这堆苹果最少有多少个。
给定一个整数n,表示熊的个数,返回最初的苹果数。保证有解。
测试样例:
2
返回:3
*/
function appleNum(n) { // n是熊的个数
var i=1;
var res=n*i+1; // res-1一定是n的整数倍
while (!isMin(n,res)){
res=n*i+1;
i++;
}
return res;
}
// 判断m是否满足 均分、拿走后剩余苹果依然能够均分
// m是总的苹果数
function isMin(n,m) {
var next=m; // next表示一只熊走后剩余的苹果,初始值设为m总的苹果数
if(Math.floor((m-1)%n)!==0) // 如果一开始m-1就无法均分,则m不满足题意(20170908update:这句可以不要,因为上面res的取值保证了(res-1)%n一定等于0)
return false;
for(var i=1;i<n;i++){ // 否则,看接下来n-1个熊能否把next-1个苹果均分
next=(next-1)*(n-1)/n; // 本次的苹果总数X[i+1]=X[i]-( X[i]/n + 1 ) ,整理一下有X[i+1]=(X[i]-1)*(n-1)/n
if(Math.floor((next-1)%n)!==0) // 如果后续有一个不能均分,则m不满足题意
return false;
}
return true; // 如果上面的循环完毕,则说明后续的熊都能够均分苹果,m满足题意
}
console.log(appleNum(2)); // 3
console.log(appleNum(3)); // 25
console.log(appleNum(5)); // 3121
console.log(appleNum(8)); // 16777209