結果
問題 |
No.1803 Remainder of Sum
|
ユーザー |
|
提出日時 | 2025-03-15 18:27:22 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 146 ms / 2,000 ms |
コード長 | 2,013 bytes |
コンパイル時間 | 333 ms |
コンパイル使用メモリ | 82,116 KB |
実行使用メモリ | 80,120 KB |
最終ジャッジ日時 | 2025-03-15 18:27:26 |
合計ジャッジ時間 | 4,112 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 8 |
ソースコード
## https://yukicoder.me/problems/no/1900 class UnionFind: """ UnionFindの基本的な処理を実装したクラス """ def __init__(self, size): self.root = [i for i in range(size)] self.size = [1] * size def get_root(self, v): if v == self.root[v]: return v else: old_root = self.root[v] new_root = self.get_root(old_root) self.root[v] = new_root return new_root def merge(self, u, v): root_u = self.get_root(u) root_v = self.get_root(v) if root_u == root_v: return False if self.size[root_u] >= self.size[root_v]: self.size[root_u] += self.size[root_v] self.root[root_v] = root_u self.root[v] = root_u else: self.size[root_v] += self.size[root_u] self.root[root_u] = root_v self.root[u] = root_v return True def solve(N, M): m = M // 2 if N >= M: return m else: if M % 2 == 0: l = N - m ans = l n = m - l ans += (n - 1) ans += (n * (n + 1)) // 2 - 1 return ans else: l = N - (m + 1) ans = l n = m - l ans += (n - 1) ans += (n * (n + 1)) // 2 - 1 return ans def solve2(N, M): edges = [] for i in range(N): for j in range(i + 1, N): edges.append((i + 1, j + 1, (i + 1 + j + 1) % M)) edges.sort(key=lambda x : x[2]) uf = UnionFind(N) answer = 0 for i, j, c in edges: if uf.merge(i - 1, j - 1): answer += c return answer def main(): T = int(input()) answers = [] for _ in range(T): N, M = map(int, input().split()) ans = solve(N, M) answers.append(ans) for ans in answers: print(ans) if __name__ == "__main__": main()