一、顺推方法
用循环遍历可能的桃子总数,最开始为队员总数加一,满足1.(sum-1)%n==0 并下一次分桃时sum的值变为((sum-1)/n)*(n-1)
每个队员所面对的(上一个留下的)桃子数都可以实现分配即可,用k计数来实现,如不满足条件1跳出循环将桃子数+队员数再进行遍历。
最后对k进行判断如果k不等于队员数,同样需要更新桃子数进行再次循环,此时上次循环中的部分变量值需更新,比如k;
注意:sum的值属于每次循环的可变值,变为分配完的桃子数,需要变量x来进行桃子数+队员数
记得最后的总数因为多加了一次队员数,所以需要减去
#include<iostream>
using namespace std;
int sum;
void pitch(int n)
{
int k=0;
int x = n + 1;
while (k != n)
{
k=0;
sum = x;
for (int i = 0; i < n; i++)
{
if ((sum - 1) % n == 0&&sum!=1)
{k++;}
else {break;}
sum = ((sum - 1) / n)*(n - 1);
}
x += n;
}
cout << x- n <<" "<<sum<<endl;
}
int main()
{
int n;//队员人数
while (scanf_s("%d", &n) != EOF)
{
pitch(n);
}
system("pause");
return 0;
}
递推法实现
bool check_num(int num,int k=1){ //k标志面临桃子数可分的猴子数
if((num-1)%5!=0)return false;
if(k==5)return true;
return check_num((num-1)*4/5,++k);
}
int pitch_num(){ //返回满足条件的S1
for(int i=6;;i+=5)
if(check_num(i))return i;
}
二、逆推法
第n个面对的桃子数可分且sum%4==0即可,k作为计数判断,k!=n-1,因为前面判断过一次第n个是否可分,并且式子变为(sum/(n-1))*m+1;根据互相的递推关系不用判断是否可余5,并且每次循环变量值变化为+4.
ps.在程序开头加上#define _CRT_SECURE_NO_WARNINGS或者#pragma warning(disable:4996),可关闭安全检查,当然在oj上要去掉