Codeforces Round #70(Div2 only)

C. Beaver Game

問題概要

n本の棒があり、それぞれの長さはmメートル。それを用いて二人が以下のゲームをする。
棒を一本選び、mの約数xでx等分する。その時の長さはk以上でなければならない。

この操作ができなくなったとき、できなくなったプレイヤーが負けである。
n,m,kが与えられたとき、先手または後手どちらが勝つかを返せ。プレイヤーは二人とも最善をつくすものとする。

方針

切れる棒が0本の時後手必勝。
1本のとき、m/k以下で最大の約数の本数に切ることにより、切れる棒を0本にできる。
すなわち先手必勝。
2本の時は、上を行えば1本にできるので後手必勝。
同様に切れる棒が偶数の時は後手必勝で、奇数の時は先手必勝。

初期状態で切れる棒があるかどうかは、
mが2以上の約数x(ただしm/x>=kを満たす)をもつかどうかにより判定すればいい。

int n,m,k;

void run(){
  cin>>n>>m>>k;
  //mにk<=m/xを満たすような2以上の約数xがある
  if(k==1){
    if(n%2&&m>1)cout<<"Timur"<<endl;
    else cout<<"Marsel"<<endl;
    return;
  }
  for(int i=2;(ll)i*i<=m;i++)if(m%i==0&&(m/i>=k||i>=k)){
      if(n%2)cout<<"Timur"<<endl;
      else cout<<"Marsel"<<endl;
      return;
    }
  cout<<"Marsel"<<endl;
}