【洛谷P2696】慈善的约瑟夫

时间:2020-12-04 16:39:38

题解:根据《具体数学》上关于迭代约瑟夫问题性质的总结如下:多次迭代的约瑟夫问题的解具有循环移位性质,且答案最终会收敛到不动点处。

代码如下

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10; int dp[maxn],n,ans; void solve(){
dp[1]=1;
for(int i=2;i<=n;i++){
if(i&1)dp[i]=2*dp[i>>1]+1;
else dp[i]=2*dp[i>>1]-1;
}
while(n^dp[n]){
ans+=n-dp[n];
n=dp[n];
}
ans+=(dp[n]<<1);
printf("%d\n",ans);
} int main(){
scanf("%d",&n);
solve();
return 0;
}