カメヲラボ

主にプログラミングとお勉強全般について書いてます

Card Trick

なんかシャッフルする問題。ちゃんとした説明は例によってnanagyouさんのところから。
http://geocities.yahoo.co.jp/gl/nanagyou/view/20070312/1173632750
賢いアルゴリズムが見つかれば大幅に短縮できると思いますが、ベタな解き方しか思い浮かびませんでした(;´д`)

a[999];i,*k=a,p;
main(n,j){
  for(gets(j);~scanf("%d",&n);p=i=puts(a))
  {
    for(;i<n;k[p]=i)
      for(j=++i;~j;j-=!k[++p])p%=n;

    for(;*++k;)printf("%d ",*k);
  }
}

配列の0番目は改行用。初期化をするとどうしてもコードが長くなってしまうので、使いっぱなしの方向で。なんか良い方法ありそうな気がするのですが・・・。