问题描述
秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分。这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果。第一只猴子悄悄来到山洞,把苹果平均分成n份,把剩下的m个苹果吃了,然后藏起来一份,最后把剩下的苹果重新合在一起。这些猴子依次悄悄来到山洞,都做同样的操作,恰好每次都剩下了m个苹果。第二天,这些猴子来到山洞,把剩下的苹果分成n分,巧了,还是剩下了m个。问,原来这些猴子至少采了多少个苹果。
输入格式
两个整数,n m
输出格式
一个整数,表示原来苹果的数目
样例输入
5 1
样例输出
15621
数据规模和约定
0 < m < n < 9
关键:假设从第一次分苹果开始,每分一次所剩苹果数为s,则s%n==m,s%(n-1)==0
思路:从最后一次向前倒推
#include <iostream>
using namespace std;
int main()
{
int m,n,i,k,s;
cin>>n>>m;
for(i=1; ;i++)
{
if(i%n==m&&i%(n-1)==0)//从最后一次开始倒推
{
s=i;
for(k=1;k<n;k++)
{
s=s+s/(n-1)+m;//获得前一次的苹果数
if(s%n!=m||s%(n-1)!=0)//若不符合条件则退出递推循环
{
break;
}
}
if(k==n)//找到符合的最小的苹果数
{
s=s+s/(n-1)+m;//获得总苹果数
cout<<s<<endl;
break;
}
}
}
return 0;
}