Python3で解く AtCoder Beginner Contest 147 D - Xor Sum 4
問題を把握するには、連続したシグマが何を意味しているのか、XORの特性を理解することがポイント。それさえできれば結構単純。自分は桁ごとに考えた。制約としてギリなのでローカル化しないとTLE。もっと工夫できるのかもしれないけど。
目次
概要
問題
1. 個の整数が与えられる。
1. をで割った余りは?
制約
解くときに考えた内容
- このシグマの連続()はどういう意味か?
- の時、i=1から順に代入していくと
- ということ
- 個の重複のない組み合わせでのXORの和ということ
- XORをどう考えるか
- 桁ごとに考える。
- より一般に考える。
- の桁目が1である数をとすると、XORをとって1になる組み合わせ数は。
- 桁目はである。
- の全ての桁の和が求めるものとなる。
- 桁ごとに考える。
コード
今回はローカル化しないとTLEになってしまうので注意。
def main(): n = int(input()) A = [int(x) for x in input().split()] ans = 0 mod = 10 ** 9 + 7 # 制約がai <= 2**60なので for d in range(61): # d桁目ごとに考える x = 0 for a in A: if (a >> d) & 1: x += 1 ans += x * (n-x) * 2**d ans %= mod print(ans) if __name__ == '__main__': main()
書籍
アルゴリズムの参考書籍
いわゆる、螺旋本。Aizu Online Judgeの問題を題材に解説されている。自分としては、 Aizu Online Judgeは最近はβ版運用中で、構成がアルゴリズムの項目ごとに問題がタグ付けされているようなイメージで、ここら辺弱いから集中的にやってみようっていう感じでできるので、いいと思っている。(AtCoderもそんな感じのリスト作って欲しい) ただ、この書籍はC++で書かれているのでPythonでやる場合はあくまでもその過程の考え方を参考にし自分で実装する必要がある。(AOJも解いているので、記事にしていこうかなぁ)
最近ポチった書籍
けんちょんさんこと、大槻さんの書籍である、「問題解決力を鍛える!アルゴリズムとデータ構造」 ご本人の記事の中で難易度は、螺旋本ということで初学者でも結構読みやすいのではないかと期待。(というのもけんちょんさんの記事はC++に疎い自分でも、その思考プロセスを学べるくらい丁寧に書かれているので)
投稿時点では、まだ発売前だけど、すでにベストセラー。予約しておかないとすぐ手元に来ないかも!?と思って速攻ポチった。
問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書)
- 作者:大槻 兼資
- 発売日: 2020/10/02
- メディア: 単行本(ソフトカバー)