P2696

· · 题解

推公式

0,1,2,3,4……k,k+1,……M-1,共M个人中,要删除报数为k的人,假设最后的幸存者编号为X,则第一只被删除的人的编号一定是(K-1)%M,第一个人出圈后下一轮是:K,k+1……M-1,0,1……k-1,这M-1只人。把这个序号映射为以下编号 0,1,2,3,4……,k+1,……M-2,在这个序列中,假设最后的幸存者编号为Y,则X=(Y+K)%M

K→0 k+1→1 K+2→2

则有

int what(int n,int k){
    int t=0;
    for(int i=2;i<=n;i++)t=(t+k)%i;
    return t+1;
}

main:

int main(){
    scanf("%d",&n);
    while(1){
        int s=what(n,2);//交替出圈,所以k=2
        if(s==n){ans+=s*2;break;}//剩下的每人2元
        ans+=(n-s);//出去的发1元
        n-=(n-s);//该出去的出去
    }
    printf("%d",ans);
    return 0;
}

by 我的老师+我自己的思考

PS:因为一开始写错成猴子选大王了,与题意不符,改了一下,希望管理员再审一下。谢谢!