結果
| 問題 |
No.737 PopCount
|
| コンテスト | |
| ユーザー |
Haru
|
| 提出日時 | 2022-07-22 02:02:33 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 47 ms / 1,000 ms |
| コード長 | 1,444 bytes |
| コンパイル時間 | 149 ms |
| コンパイル使用メモリ | 82,464 KB |
| 実行使用メモリ | 62,060 KB |
| 最終ジャッジ日時 | 2024-07-03 10:04:39 |
| 合計ジャッジ時間 | 1,731 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 15 |
ソースコード
import os, sys; sys.setrecursionlimit(10**7)
readline = sys.stdin.readline
# from collections import defaultdict, deque, Counter
# from heapq import heapify, heappush, heappop
# from itertools import accumulate, chain
# from operator import add
# from bisect import bisect_left, bisect_right, insort
# import math
# from decimal import Decimal
# from random import randrange
# from typing import *
# import time
mod = 10 ** 9 + 7
def popcount63(x):
x = (x & 0x5555555555555555) + ((x >> 1) & 0x5555555555555555)
x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333)
x = x + (x >> 4) & 0xF0F0F0F0F0F0F0F
x = x + (x >> 32) & 0xFFFFFFFF
return ((x * 0x1010101) & 0xFFFFFFFF) >> 24
def main():
N = list(map(int, bin(int(readline()))[2:]))
k = len(N)
dp = [[0] * 60 for _ in range(k)]
tmpn = 0
for i in range(k):
tmpn <<= 1
tmpn += N[i]
dp[i][popcount63(tmpn)] = tmpn
n = tmpn
dp2 = [[(0, 0)] * 60 for _ in range(k)]
for i in range(k):
dp2[i][0] = (1, 0)
for i in range(1, k):
for j in range(1, 60):
p = dp2[i - 1][j - 1][0] + dp2[i - 1][j][0]
q = 2 * dp2[i - 1][j - 1][1] + dp2[i - 1][j - 1][0] + 2 * dp2[i - 1][j][1]
if N[i] and dp[i - 1][j]:
p += 1
q += 2 * dp[i - 1][j]
dp2[i][j] = (p % mod, q % mod)
ans = popcount63(n) * n
for d in range(60):
ans += dp2[-1][d][1] * d
ans %= mod
print(ans)
if __name__ == '__main__':
main()
Haru