Joseph Problem

【分析】

举个具体的例子

[012345] [ 0 1 2 3 4 5 ] n=6 n = 6 k=3 k = 3 ,解为 f(6,k) f ( 6 , k )

第一轮开始
[01×345] [ 0 1 × 3 4 5 ] ,编号为 2 2 的玩家被踢出

f [34501] [ 3 4 5 0 1 ] ,重新排列以保持模 6 6 意义下的连续性,此时的下标系统记为f n=5 n = 5 k=3 k = 3 ,解为 f(5,k) f ′ ( 5 , k ) ,并有 f(6,k)=f(5,k) f ( 6 , k ) = f ′ ( 5 , k ) 成立

f f [01234],重新从 0 0 开始编号,又回到了f下标系统

观察从下标系统 f f 到下标系统f的变换关系, ff f → f ′ :首先加 k=3 k = 3 ,然后模 n=6 n = 6

从而有 f(6,k)=f(5,k)=(f(5,k)+k)%6 f ( 6 , k ) = f ′ ( 5 , k ) = ( f ( 5 , k ) + k ) % 6

同理可得
f(5,k)=(f(4,k)+k)%5 f ( 5 , k ) = ( f ( 4 , k ) + k ) % 5
f(4,k)=(f(3,k)+k)%4 f ( 4 , k ) = ( f ( 3 , k ) + k ) % 4
f(3,k)=(f(2,k)+k)%3 f ( 3 , k ) = ( f ( 2 , k ) + k ) % 3
f(2,k)=(f(1,k)+k)%2 f ( 2 , k ) = ( f ( 1 , k ) + k ) % 2
直到边界 n=1 n = 1 f(1,k)=0 f ( 1 , k ) = 0

于是可得递推公式
f(n,k)={0(f(n1,k)+k)%nn=1n>1 f ( n , k ) = { 0 n = 1 ( f ( n − 1 , k ) + k ) % n n > 1

【练习】
nowcoder 圆圈中最后剩下的数

【代码】

int JosephProblem( int n, int k )
{ 
    int result = 0;

    for( int i = 2; i <= n; i++ )
        result = ( result + k ) % i;

    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值