hdu Eddy's 洗牌问题

模拟+找规律

Eddy's 洗牌问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2770    Accepted Submission(s): 1830


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 ,但是却是有2N张牌,弄了半天才发现看错题目了,略坑啊~~)

规律:锁定第一张牌,当第一张牌回到排头了,整副牌也就还原了。

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int fun(int x)//第一张牌的路线,这就是规律公式~~
{
    if(x<=n)
       return 2*x;
    return 2*(x-n)-1;
}
int main()
{
    int i,j,temp;
    while(~scanf("%d",&n))
    {
         for(i=1,j=0;;)
         {
             temp=fun(i);
             if(temp==1)
                break;
             i=temp;
             j++;
         }
         printf("%d\n",j+1);
    }
    return 0;
}


你可能感兴趣的:(hdu Eddy's 洗牌问题)