サークル:シャオミンが楽しいゲームに登録しました。ゲームのゲームルールは次のとおりです。円形のトラックでは、N個のボールが等距離に配置され、ボールは開始点から時計回りに1からNの番号が付けられます。 。最短時間でトラック上でできるだけ多くのボールを持っているプレーヤーが勝ちます

タイトル説明

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

おすすめ

転載: blog.csdn.net/tianxiefenxiang/article/details/107319341