算法训练 猴子分苹果c语言,算法训练 猴子分苹果
問題描述
秋天到了,n只猴子采摘了一大堆蘋果放到山洞里,約定第二天平分。這些猴子很崇拜猴王孫悟空,所以都想給他留一些蘋果。第一只猴子悄悄來到山洞,把蘋果平均分成n份,把剩下的m個蘋果吃了,然后藏起來一份,最后把剩下的蘋果重新合在一起。這些猴子依次悄悄來到山洞,都做同樣的操作,恰好每次都剩下了m個蘋果。第二天,這些猴子來到山洞,把剩下的蘋果分成n分,巧了,還是剩下了m個。問,原來這些猴子至少采了多少個蘋果。
輸入格式
兩個整數,n m
輸出格式
一個整數,表示原來蘋果的數目
樣例輸入
5 1
樣例輸出
15621
數據規模和約定
0
此題類似李政道教授的那道猴子分桃算術題,用巧解的方法果然高效美妙。
可設蘋果總數為x, 往總數里加(n-1)*m個蘋果使y = x + (n-1)*m;
第一只猴子吃m個蘋果再藏(x-m)*(1/n)個,即第一只猴子共拿了y*(1/n)個蘋果,蘋果剩(n-1)/n * y,
......可以依此類推,最后蘋果剩n*一個整數再加m個。(自己動手動腦豐衣足食 :) , 可以假設加一只猴子)
得出公式: x ?= ?(n ^ n+1) - ((n - 1) * m)
#include
int main()
{
int n,m, p, t, sum;
scanf("%d%d", &n, &m);
t = n+1;
p = 1;
while(t -- > 0){
p *= n;
}
sum = p - ((n - 1 ) * m);
printf("%d", sum);
return 0;
}
但由于OJ第一個測試數據出錯,第二天猴子們把蘋果分成n份時,一份至少1個,所以本題題解不是百分之百正確。
更正后公式應為: x = k(n ^ n+1) - ((n - 1) * m)
更正后題解
#include
int main()
{
int n,m, o, p, k, t, sum;
scanf("%d%d", &n, &m);
t = n+1;
p = 1;
o = 1;
k = 1;
while(t -- > 0){
p *= n;
o *= (n-1);
}
o /= (n-1);
while(o < m+1){
k ++;
p *= k;
o *= k;
}
sum = p - ((n - 1 ) * m);
printf("%d", sum);
return 0;
}
總結
以上是生活随笔為你收集整理的算法训练 猴子分苹果c语言,算法训练 猴子分苹果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言中的typedef struct相
- 下一篇: 佣金万2.5是什么意思