洗牌问题(题解)

题目描述

给你2N张牌,编号为1,2,3…n,n+1,…2n,这也是最初的牌的顺序。
一次洗牌是把序列变为n+1,1,n+2,2,n+3,3,n+4,4…2n,n。
可以证明,对于任意自然数N,都可以在经过M次洗牌后第一次重新得到初始的顺序。
编程对于小于1e8的自然数N,求出M的值。

标程

#include
using namespace std;
int main(){
    int n,i=1,m=0;
    cin>>n;
    do{
        if(i>n) i=((i-n)<<1)-1;
        else i<<=1;
        m++;
    }while(i!=1);
    cout<<m<<endl;
    return 0;
}

你可能感兴趣的:(题解)