結果
問題 | No.1383 Numbers of Product |
ユーザー |
👑 ![]() |
提出日時 | 2021-02-07 22:00:22 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,449 bytes |
コンパイル時間 | 145 ms |
コンパイル使用メモリ | 82,196 KB |
実行使用メモリ | 226,472 KB |
最終ジャッジ日時 | 2024-07-04 15:29:32 |
合計ジャッジ時間 | 46,309 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 47 TLE * 4 |
ソースコード
"""Aで場合分けしたい!!AはX以下Bはあまり大きくならないBに関してAを二分探索B = 1の時A * (A+K) がすでに多いのが嫌だB = 2以上の場合は列挙可能列挙した後、M個の奴 or M-1個のやつに関してB=1があるかを判定すればよいAを二分探索すれば見つかるM = 1の場合だけ嫌だな別で処理するA*(A+K)の中で、バッティングした数を覚えておくそれ以外の A*(A+K)"""import sysimport heapqfrom collections import dequefrom sys import stdindef want(A,B):ret = Afor i in range(B):ret *= A + (i+1)*Kreturn retdic = {}N,K,M = map(int,stdin.readline().split())if M != 1:# B >= 2 の全列挙for B in range(2,22):for A in range(1,10**9):X = want(A,B)if X <= N:if X not in dic:dic[X] = 1else:dic[X] += 1else:breakans = 0#B = 1があるかを検索for X in dic:if M-1 <= dic[X] <= M:l = 0r = 10**18while r-l != 1:m = (l+r)//2if m*(m+K) <= X:l = melse:r = mif l*(l+K) == X:dic[X] += 1if dic[X] == M:ans += 1print (ans)else: #M==1の場合# B >= 2 の全列挙for B in range(2,22):for A in range(1,10**9):X = want(A,B)if X <= N:if X not in dic:dic[X] = 1else:dic[X] += 1else:breakans = 0bat = 0#B = 1があるかを検索#print (dic)for X in dic:l = 0r = 10**18while r-l != 1:m = (l+r)//2if m*(m+K) <= X:l = melse:r = m#print (X,l,K)if l*(l+K) == X:bat += 1dic[X] += 1if dic[X] == M:ans += 1#print (ans,bat,file=sys.stderr)#有効な最大のAを求めるl = 0r = 10**18while r-l != 1:m = (l+r)//2if m * (m+K) <= N:l = melse:r = mans += l - batprint (ans)