题目描述
你一定听说过经典“约瑟夫”问题吧?现在来组织一个皆大欢喜的新游戏:假设 n 个人站成一圈,从第 1 人开始交替的去掉游戏者,但只是暂时去掉(例如,首先去掉 2),直到最后剩下唯一的幸存者为止。幸存者选出后,所有比幸存者号码高的人每人将得到 1 块钱,并且永久性地离开,其余剩下的人将重复以上过程,比幸存者号码高的人每人将得到 1 块钱后离开。一旦经过这样的过程后,人数不再减少,最后剩下的那些人将得到 2 块钱。请计算一下组织者一共要付出多少钱?
例如,第一轮有 5 人,幸存者是 3,所以 4、5 得到 1 块钱后离开,下一轮幸存者仍然是 3,因此没有人离开,所以每人得到 2 块钱,总共要付出 2+2*3=8 块钱。(从二开始淘汰 依次为2 4 1 5 每次跳过一个淘汰)
输入:
一行一个整数 n。
输出:
一行一个整数,不超过65535,表示总共要付出多少钱。
样例输入
10
样例输出
13
数据范围:n < 32767。
思路:参考链接https://blog.csdn.net/qq_32451161/article/details/50754299得出公式 然后计算就OK。
#include<iostream>
using namespace std;
int a[33000],b[33000];
int main()
{
int n,i=2;
cin>>n;//输入
a[1]=1;
b[1]=1;
while(i<=n)
{
b[i]=(b[i-1]+1)%i+1;//此公式可人为推得 我也解释不清......
if(b[i]==i) a[i]=i;
else a[i]=a[b[i]];//金币数
i++;
}
cout<<a[n]+n;//输出
}