タイトル説明
Xiao Mingは楽しいゲームにサインアップしました。ゲームのゲームルールは次のとおりです。円形のトラックでは、N個のボールが等距離に配置され、ボールは開始点から時計回りに1からNの番号が付けられます。最短時間で取り出されます。トラック上にできるだけ多くの小さなボールを持っているプレイヤーが勝ちます。主催者は、各プレーヤーが時計回りの方向にのみ従い、M-1番号をスキップして、次の小さなボールを取ることができることを要求します。たとえば、N = 5およびM = 3の場合、Xiao Mingはすべてのボールを受け取ることができ、取る順序は1-> 4-> 2-> 5-> 3です。N = 6およびM = 2の場合、XiaoMingは3つの小さなボール1-> 3-> 5しか取ることができません。Xiao Mingは、ゲームで取ることができる小さなボールの数を知りたいと思っています。もちろん、Xiao Mingはその方法を知っていますが、宿題を作るのに忙しいので、この簡単な質問をします(shuai guo)。
入力データ
入力データの最初の行は整数Tであり、テストサンプルのTグループがあることを示します。例の各セットは、2つの整数NとMを含む個別の行です。
出力データ
入力データのグループごとに、結果「Case #id:M」の行を出力します。これは、idグループデータの結果がMであり、idが1から始まることを意味します。
サンプル入力
3
5 3
6 2
10 6
サンプル出力
ケース#1:5
ケース#2:3
ケース#3:5
私の解決策(達成可能ですが非効率的)
T = int(input())
for M in range(T) :
dArray = []
inputStr = input()
if inputStr != "":
ns = inputStr.split()
N = int(ns[0])
step = int(ns[1])
p = 1
for n in range(N-len(dArray)):
if p > N:
p = p - N
if p in dArray:
break
else:
dArray.append(p)
p = p + step
M = M + 1
print("Case #%d: %d" % (M,len(dArray)))
else:
break
推奨される解決策(除算法で最大公約数を見つける)
経験:複雑さの問題、最大公約数を介した走査を高速化する
def gcd(a, b): #辗转相除法求最大公约数
if b == 0:
return a
else:
return gcd(b, a%b)
T = int(input())
for n in range(T) :
dArray = []
inputStr = input()
if inputStr != "":
ns = inputStr.split()
N = int(ns[0])
M = int(ns[1])
result = gcd(N, M)
print("Case #%d: %d" % (n + 1 , N / result))
else:
break