質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

973閲覧

atcoder168eが分からず困ってます。

syuheisyosinsya

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/09 11:01

atcoderで下記問題に対して
問題
参考URL

下のコードで回答されている方がいて、
この39行目
result *= pow(2, i + j, 1000000007) + pow(2, k + l, 1000000007) - 1
ここの処理が理解できず困っています。
こなぜi+j乗とk+l乗でかけるのでしょうか?
ご教示よろしくお願いいたします。

python

1from math import gcd 2 3N = int(input()) 4AB = [map(int, input().split()) for _ in range(N)] 5 6t = [] 7d = {} 8d[0] = {} 9d[0][0] = 0 10for a, b in AB: 11 i = gcd(a, b) 12 if i != 0: 13 a //= i 14 b //= i 15 t.append((a, b)) 16 d.setdefault(a, {}) 17 d[a].setdefault(b, 0) 18 d[a][b] += 1 19 20used = set() 21result = 1 22for a, b in t: 23 if (a, b) in used: 24 continue 25 used.add((a, b)) 26 if a == 0 and b == 0: 27 continue 28 i = d[a][b] 29 j, k, l = 0, 0, 0 30 if -a in d and -b in d[-a]: 31 j = d[-a][-b] 32 used.add((-a, -b)) 33 if -b in d and a in d[-b]: 34 k = d[-b][a] 35 used.add((-b, a)) 36 if b in d and -a in d[b]: 37 l = d[b][-a] 38 used.add((b, -a)) 39 result *= pow(2, i + j, 1000000007) + pow(2, k + l, 1000000007) - 1 40 result %= 1000000007 41result += d[0][0] - 1 42result %= 1000000007 43print(result)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この問題は、イワシの特徴をベクトルで考えた場合、そのベクトルが直交する組はどのくらいあるかという問題に置き換えることができます。
例えばa,bを(a,b)のベクトルと考えると、(-b,a)との内積は0です。
また、(-b,a)は(-a,-b)とのベクトルの内積も0です。
なので、(a,b)と(-a,-b)は(-b,a)に対して同じグループと解釈することができます。

参考URLの、

また (-b, a), (b, -a) は (-a, -b) とも仲が悪いので、(a, b) と (-a, -b) はグループとなる.

という表現と同じです。

iとjは(a,b)(-a,-b)のグループで、kとlは(-b,a)(b,-a)のグループになります。
グループijとグループklのイワシは双方必ず仲が悪いです。
件の階乗の計算は、双方のグループからイワシを選択する組み合わせを表しています。

(ijグループ内でイワシを選ぶ全パターン)+(klグループ内でイワシを選ぶ全パターン)

なお、一番最後の-1は、どちらのグループからも1匹も選ばれなかった場合を除外しています。

このあたりの考え方はyoutubeの解説を見るとよく理解できるのではないかと思います。
(私はyoutube見ないと分かりませんでした)

投稿2020/06/10 03:07

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syuheisyosinsya

2020/06/10 10:01

内積も出てくるんですね。勉強になります。 回答依頼に対応していただき本当にありがとうございます!
hope_mucci

2020/06/10 11:08

内積も出てくる、というより内積そのものです。 ぜひyoutubeの解説を見てください。イワシはこじつけということがよくわかります。 AtCoderのコンテストは高校~大学の数学知識がないと後半の問題は全然太刀打ちできないので、数学の勉強も必須です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問