果园里有一堆苹果,一共n头(n大于1小于8)熊来分,第一头为小东,它把苹果均分n份后,多出了一个,它扔掉了这一个,拿走了自己的一份苹果,接着第二头熊重复这一过程,即先均分n份,扔掉一个然后拿走一份,以此类推直到最后一头熊都是这样(最后一头熊扔掉后可以拿走0个,也算是n份均分)。问最初这堆苹果最少有多少个?
果园里有一堆苹果,一共n头(n大于1小于8)熊来分,第一头为小东,它把苹果均分n份后,多出了一个,它扔掉了这一个,拿走了自己的一份苹果,接着第二头熊重复这一过程,即先均分n份,扔掉一个然后拿走一份,以此类推直到最后一头熊都是这样(最后一头熊扔掉后可以拿走0个,也算是n份均分)。问最初这堆苹果最少有多少个?
给定一个整数n,表示熊的头数
返回最初的苹果数。保证有解。
2
3
设这堆桃子至少有x个,借给它们4个,成为x+4个。5个猴子分别拿了a,b,c,d,e个桃子(其中包括吃掉的一个桃子),则可得 a=(x+4)/5,b=4(x+4)/25,c=16(x+4)/125,d=64(x+4)/625,e=256(x+4)/3125 e应为整数,而256不能被5整除,所以(x+4)应该是3125的倍数,所以(x+4)=3125k(k为自然数)。当k =1时,x=3121 所以,5个猴子至少摘了3121个桃子 (3121-1)/5*4=2496(个) (2496-1)/5*4=1996(个) (1996-1)/5*4=1596(个) (1596-1)/5*4=1276(个) (1276-1)/5*4=1020(个) 所以最后剩下1020个 所以 n个熊的时候就是 n^n-(n-1)...
import java.util.*;
public class Apples {
public int getInitial(int n) {
// write code here
int start = n + 1; // 从n+1开始尝试
while(true){
if(judge(start, n)) break;
start ++;
}
return start;
}
private boolean judge(int apples, int n) {
int bears = n;
while(bears > 0){
// 要保证每次扔掉一个苹果之后剩下的都能均分为n份
if(apples % n == 1){
apples -= 1 + apples / n;
// 有一个熊已经分完了
bears --;
}else
return false;
}
// 是否所有的熊都分到了
return bears == 0;
}
} import java.util.*;
public class Apples {
public int getInitial(int n) {
// write code here
int num = 1-n;
while (true) {
num += n;
boolean f = false;
int num1 = num;
for (int i = 2; i <= n; i++) {
if (num1 % (n-1) != 0) {
f = true;
break;
}
num1 = num1 * n / (n-1) + 1;
}
if (!f) return num1;
}
}
} 从后往前推,知道为什么小熊数量有限制了,上了9个后花了十几秒...
class Apples:
def getInitial(self, n):
if n == 2:
return 3
else:
begin = 1 #如果不是2个小熊,那么最后一个小熊最少得到一个,初始化从1开始
b = 0
while True:
res = begin * n + 1
for i in range(n-1):
a,b = divmod(res,n-1)
if b != 0:
break
res = a*n + 1 #余数一直为零才符合要求
if b != 0:
begin += 1
else:
return res
数学王子们的解答会非常简洁,直接 return (n ** n - n + 1).
然而我:
class Apples:
def getInitial(self, n):
flag = True
x_0 = n
while flag:
x_0 = x_0 + 1
x = x_0
i = 1
while (i < (n + 1)):
if (x % n == 1):
x = x - 1 - (x - 1) / n
i = i + 1
if (i == (n + 1)):
flag = False
else:
break
return x_0
只能模拟这个过程。遍历,从总苹果数x_0 = n + 1开始,若x_0满足每次求余得1,则返回x_0,
否则x_0 = x_0 + 1 继续这个过程,直到找到满足条件的x_0为止。
class Apples {
public:
int getInitial(int n) {
int x = n;
while (++x)
{
int temp = x;
for (int i = 0; i < n; i++)
{
if ((temp - 1) % n == 0)
temp = (temp - 1) / n*(n - 1);
else
break;
if (i == n - 1)
return x;
}
}
return x;
}
};
很多高票的答案都有问题,老老实实用暴力法。
public int getInitial(int n) {
//return n*n-n+1;
for (int i = 1; i < Integer.MAX_VALUE; i++) {
int count = i;
boolean flag = false;
for (int j = 1; j <= n; j++) {
count--;
if (count % n == 0){
count = count / n *(n-1);
} else {
flag = true;
break;
}
}
if(!flag){
return i;
}
}
return 0;
}
class Apples {
public:
int getInitial(int n) {
// write code here
//x为每份苹果的数量,m为苹果总数,k从最后一个熊开始向前
int k, x, m;
for (int i = 0; ; ++i) {
k = 1;
x = i;
m = n*x+1;
while (k < n) {
if (m >= n-1 && m%(n-1) == 0) {
x = m/(n-1);
m = n*x+1;
++k;
} else
break;
}
if (k == n)
return m;
if (k != n)
continue;
}
return m;
}
};
class Apples {
public:
int getInitial(int n) {
int i=0,R,k,flag=1;
while(flag){
while((i*n+1)%(n-1))
i++;
R=n*i+1;//最后一头熊没扔之前可能剩下的苹果数;
k=n;
while(k>1&&R%(n-1)==0){//R%(n-1)==0判断剩下的苹果数是否合法
R=R/(n-1)*n+1;//逆序推前一头熊没扔之前剩下的苹果数;
k--;
}
if(k==1)
flag=0;
i++;
}
return R;
}
};
//只能遍历了,从1,n+1,2n+1,3n+1开始
class Apples {
public:
bool IsValid(int shu, int n)
{
int cc=n;
while(shu%n == 1)
{
cc--;
if(!cc)
return true;
shu = shu -shu/n-1;
}
return false;
}
int getInitial(int n) {
// write code here
int cc=0;
while(1)
{
if(IsValid(cc*n+1,n))
{
return cc*n+1;
}
cc++;
}
}
};
import java.util.*;
public class Apples {
public int getInitial(int n) {
int init=0,k,i,next=0,result;
while(true){
k=init;
for(i=1; i<n; i++){
next = k*n+1;
if(next%(n-1)==0){
k=next/(n-1);
}
else{
init++;
break;
}
}
if(i==n){
result = k*n+1;
break;
}
}
return result;
}
}
classApples{public:intgetInitial(intn){intresult = 0;for(inti = 1; true; i++){result = i;bool flag = false;//cout << "i = "<< i << endl;for(intj = 0; j < n; j++){//cout << "result = " << result << endl;if(result > 0&& (result - 1) % n == 0){result = (result - 1)*(n - 1)/n;flag = true;} else{flag = false;break;}}if(flag)returni;}returnresult;}};
public class Apple {
public static int getInitial(int n) {
for(int i=n+1;;i++) {
int temp=i;
int bear=n;
while(bear>0) {
if(temp%n==1){
temp=temp-temp/n-1;
bear--;
}else {
break;
}
}
if(bear==0) {
return i;
}
}
}
public static void main(String[] args){
System.out.println(getInitial(2));
}
}
无法从后往前推,因为最后一个熊拿到的个数是不确定的,所以就使用遍历,从n+1开始,判断在每一次的加减的过程中,该数是否对n取余等于1,如果是则继续减,直到熊的个数等于0为止,否则就进入下一个数的判断。
import java.util.*;
/**思路:因为每次分n堆都会多出来1个,所以我们借给熊n-1个,以致每次都可以刚好分成n堆*/
public class Apples {
public int getInitial(int n) {
long a = (long)Math.pow(n, n);
return (int)a-n+1;
}
}