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:因为一开始写错成猴子选大王了,与题意不符,改了一下,希望管理员再审一下。谢谢!