【洛谷P2696】慈善的约瑟夫

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

代码如下

#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;
}
posted @ 2019-01-21 21:53  shellpicker  阅读(282)  评论(0编辑  收藏  举报