题目背景
faebdc和zky又在玩扑克
题目描述
给你2N张牌,编号为1,2,3..n,n+1,..2n。这也是最初的牌的顺序。 一次洗牌是把序列变为n+1,1,n+2,2,n+3,3,n+4,4..2n,n。可以证 明,对于任意自然数N,都可以在经过M次洗牌后第一次重新得到 初始的顺序。给定N,求出M的值。
输入输出格式
输入格式:一个数n
输出格式:一个数m
输入输出样例
说明
置换群
对于100%的数据,nle 10^8n≤108
/* 设洗牌前牌的位置为 xx,洗牌后的位置为 yy,有: y=x*2 (x<=n) y=(x-n)*2-1 (x>n) 以第 1 张牌为对象,用上面的方式给它“洗牌”,如果洗牌过程中它回到了 1 的位置,此间洗牌的次数即为答案。 */ #include<iostream> #include<cstdio> using namespace std; int n,m,p; int main(){ scanf("%d",&n); for(m=0,p=1;m==0||p!=1;m++){ if(p<=n)p=p*2; else p=(p-n)*2-1; } printf("%d",m); return 0; }