HDu Eddy'sトランプ問題

1685 ワード

シミュレーション+法則を探す
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の問題をするのが好きなだけではなくて、その上カードに対しても一定の研究があって、彼は退屈な時に研究して発見して、もし彼が2 N枚のカードがあれば、番号は1,2,3..n,n+1,.2 nです.これも最初のカードの順番です.カードを1回シャッフルすることで、カードのシーケンスをn+1,1,n+2,2,n+3,3,n+4,4..2n,nに変えることができます.従って,任意の自然数Nに対して,M回のシャッフル後初めて初期の順序が再得られることが証明された.プログラミングは100000未満の自然数Nに対してMの値を求める.
 
Input
行ごとに1つの整数N
 
Output
これに対応するMを出力する
 
Sample Input

   
   
   
   
20 1

 
Sample Output

   
   
   
   
20 2

 
问题解决:最初は半日探しても规则が见つからなかったが、大牛のブログを参考にしてやっと分かった......(注意:テーマはNを入力するのだが、2 N枚のカードがあって、半日やってやっとテーマを见間違えたことに気づいた.
法則:最初のカードをロックして、最初のカードが先頭に戻ると、カード全体が復元されます.
#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
",j+1); } return 0; }