队列模拟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include<queue> queue<int>ql; int n=read(),k=read(); for(int i=1;i<=n;i++){ q.push(i); }
int now=1; while(q.size()){ if(now==k){ cout<<q.front()<<" "; q.pop(); now=1; } else{ now++; q.push(q.front()); q.pop(); } }
|
公式法
f(10,3)=(f(9,3)+3)%10
∴ 从n中依次删去第k的数子
f(n,k)=(f(n-1,k)+k)%n
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int josephus(int n,int k){ if(n==1)return 0; return (josephus(n-1,k)+k)%n; }
int josephus(int n,int k){ int value=0; for(int i=1;i<=n;i++){ value=(value+k)%i; } return value; } int n=read(),k=read(); cout<<josephus(n,k)+1<<endl;
|