果园里有一堆苹果,一共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; } }