カメヲラボ

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

ぐっちょいばっちょい

http://acm.pku.edu.cn/JudgeOnline/problem?id=1597
ネタバレではあるけど数学が得意な人には見て欲しい。

STEPとMODの2整数が与えられて、擬似乱数を発生させます。
発生ルールは

seed(x+1)=[seed(x)+STEP]%MOD

このとき、発生する乱数の均一さを判定するコードを書いてください。均一さとは、要するにseedを0として、再び0が現れるまで、1から(MOD-1)までのすべての値が1回ずつ現れるかどうかということです。
均一であればぐっちょい、そうでなければばっちょいと叫びます(ウソ)
随分前に書いたときは、MOD回ループの中でルール通り擬似乱数を発生させて途中で0が出たらアウト!みたいなコードを普通に書いてたのですが、さっきなんとなくSTEPとMODの値が互いに素ならぐっちょいなんじゃ・・・と思ってこんなコードを書いたら通りました。これって、数学的に正しいのかナァ。カシコー(゜Д゜)な人教えてたもれ。

main(s,m,d){
  for(;~scanf("%d%d",&s,&m);)
  {
    for(d=m;s%d|m%d--;);
    printf("%10d%10d    %s Choice\n\n",s,m,d?"Bad":"Good");
  }
}