Eddy‘s 洗牌问题
Problem Description
Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n。这也是最初的牌的顺序。通过一次洗牌可以把牌的序列变为n+1,1,n+2,2,n+3,3,n+4,4..2n,n。那么可以证明,对于任意自然数N,都可以在经过M次洗牌后第一次重新得到初始的顺序。编程对于小于100000的自然数N,求出M的值。
Input
每行一个整数N
Output
输出与之对应的M
Sample Input
20
1
Sample Output
20
2
找规律吧 拿N+1来找,经过多少次后能回到原来的位置。比如N=4时,5->1->2->4->8->7->5,所以是6次。
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int main() 5 { 6 int N; 7 while(cin>>N) 8 { 9 int n=1; 10 int i=1; 11 while(n!=(N+1)) 12 { 13 if(n<=N) 14 { 15 n=n*2; 16 i++; 17 } 18 else 19 { 20 n=(n-N)*2-1; 21 i++; 22 } 23 } 24 cout<<i<<endl; 25 } 26 }
时间: 2024-10-26 19:38:20