演算法訓練 猴子分蘋果
阿新 • • 發佈:2019-02-05
問題描述
秋天到了,n只猴子採摘了一大堆蘋果放到山洞裡,約定第二天平分。這些猴子很崇拜猴王孫悟空,所以都想給他留一些蘋果。第一隻猴子悄悄來到山洞,把蘋果平均分成n份,把剩下的m個蘋果吃了,然後藏起來一份,最後把剩下的蘋果重新合在一起。這些猴子依次悄悄來到山洞,都做同樣的操作,恰好每次都剩下了m個蘋果。第二天,這些猴子來到山洞,把剩下的蘋果分成n分,巧了,還是剩下了m個。問,原來這些猴子至少採了多少個蘋果。
輸入格式
兩個整數,n m
輸出格式
一個整數,表示原來蘋果的數目
樣例輸入
5 1
樣例輸出
15621
資料規模和約定
0<m<n<9
對於這個題目,還是先向你們安利一個函式的用法,那就是pow函式
標頭檔案:#include <math.h>
pow() 函式用來求 x 的 y 次冪(次方),其原型為:
double pow(double x, double y);
pow()用來計算以x 為底的 y 次方值,然後將結果返回。設返回值為 ret,則 ret = xy。
可能導致錯誤的情況:
錯誤程式碼:
注意,使用 GCC 編譯時請加入-lm。
然後,這個題目的解題思路是這樣的:
pow() 函式用來求 x 的 y 次冪(次方),其原型為:
double pow(double x, double y);
pow()用來計算以x 為底的 y 次方值,然後將結果返回。設返回值為 ret,則 ret = xy。
可能導致錯誤的情況:
- 如果底數 x 為負數並且指數 y 不是整數,將會導致 domain error 錯誤。
- 如果底數 x 和指數 y 都是 0,可能會導致 domain error 錯誤,也可能沒有;這跟庫的實現有關。
- 如果底數 x 是 0,指數 y 是負數,可能會導致 domain error 或 pole error 錯誤,也可能沒有;這跟庫的實現有關。
- 如果返回值 ret 太大或者太小,將會導致 range error 錯誤。
錯誤程式碼:
- 如果發生 domain error 錯誤,那麼全域性變數 errno 將被設定為 EDOM;
- 如果發生 pole error 或 range error 錯誤,那麼全域性變數 errno 將被設定為 ERANGE。
注意,使用 GCC 編譯時請加入-lm。
然後,這個題目的解題思路是這樣的:
此題類似李政道教授的那道猴子分桃算術題,用巧解的方法十分的高妙。
可設蘋果總數為x, 往總數里加(n-1)*m個蘋果使y = x + (n-1)*m;
第一隻猴子吃m個蘋果再藏(x-m)*(1/n)個,即第一隻猴子共拿了y*(1/n)個蘋果,蘋果剩(n-1)/n * y,
......可以依此類推,最後蘋果剩n*一個整數再加m個。
【程式碼】具體程式碼如下:
#include<iostream> #include<cstring> #include<cmath> using namespace std; int main() { int monkey, apple; long long int sum; cin >> monkey >> apple; sum = pow(monkey, monkey + 1) - (monkey - 1)*apple; cout << sum << endl; return 0; }