PKU 2657-Comfort

問題概要

円形に並んだN個のマスを持つボードゲームがあり,各マスには1からNと反時計周りに番号が付けられている.
プレイヤーは最初1のマスに駒を置く.プレイヤーの目的は駒をZ番目のマスに移動させることである.
プレイヤーが出来る唯一の行動はkマス次に進むことでマスに障害物があった場合は失敗する.
N,Z,障害物のあるマスの情報が与えられたとき,プレイヤーが目的を達成出来る最小のkを求めよ.

解法

全てのkについて試す.O(N^3)だが間に合ってしまう.

実装(C++)

#include <iostream>
#include <cstring>
using namespace std;
int N,Z,M,k;
int ob[1000];
bool check(int K){
	int s=0;
	while(1){
		s=(s+K)%N;
		if(s==0)return false;
		if(s==Z)return true;
		if(ob[s])return false;
	}
}
int main() {
	for(;cin>>N>>Z>>M;){
		memset(ob,0,sizeof(ob));
		Z--;
		for(int i=0;i<M;i++){
			cin>>k;ob[k-1]=1;
		}
		for(int i=0;i<=N;i++){
			if(check(i)){
				cout<<i<<endl;
				break;
			}
		}
	}
	return 0;
}