SlideShare ist ein Scribd-Unternehmen logo
1 von 10
Downloaden Sie, um offline zu lesen
E - 暗号化(Encipherment)



   原案 : kyuridenamida
  テスター : fura2,chokudai?
統計
●   First Acceptance
    iwiwi(75:11)

●   完答数 / 提出数 = 2 / 45
    正答率: 4.4%

●   部分点(500)最初に手に入れた人
    みけCAT(59:36)
問題
●   長さ10万の数列が与えられる
●   その数列の連続した部分列に対して、
     Pを素数とする. ハッシュ化する列を {x1,x2,x3,…,xn} とし, 全
    ての xiについて, j≦
                iかつ xj=xiが成り立つような jの個数をCiと
    すると,
             (ハッシュ値) = ΣxiCi mod P
●   という風にハッシュ値を求めるだけの問題。
部分点(20%)
●   数列中の数は全て異なる⇔常にCiは1
●
    つまり、
           (ハッシュ値) = Σxi mod P
●   これは累積和を使えば
     前計算O(N)
     1つのクエリ処理O(1)
     全体としてはO(N+Q)
●   すごく簡単。
考察
●   部分列の特定の数(aとする)だけに着目すれば、
         a1 + a2 + … + a(aが列中に存在する個数)
    がハッシュ値に足されている。

●   クエリは出力順だけ正しければ、どういう順番に
    処理しても構わない。
クエリ処理のメインアイデア
●   もしクエリが(始点,終点)のペアでソートされてたら
    (1,2) , (1,5) , (1,7) , (2,1) , (2,2) , …
●
    みたいな感じになる。
●
    始点が同じやつはまとめて処理できるので嬉しい
    –   なぜかというと、たとえば
         (1,2)の結果がもとまっているとして、
         (1,5)の結果はそれの右端を3伸ばしたものであり、
         (1,7)の結果はさらに右端を2伸ばしたものだから。

●   しかし始点が全て異なる場合やはりクエリ処理全体でO(NQ)か
    かってしまう。
計算量改善(間違いだらけかも)
●   そこで、始点を√n個程度のバケットに分けて、
         (始点が含まれるバケットの番号,終点)
    のペアでソートすると、以下のことが分かる。
    –   さっきは右端しか伸びなかったが、今回は左端が伸びたり縮んだり
        する可能性がある。 
    –   ↑について、バケット内での1つの要素について、O(√n)回左端が
        伸びたり縮んだりする。
    –   それ以外の部分で、1つのバケットにつき後ろがO(N)回伸びる。前
        もO(N)回伸びる。つまり前後が,O(2N√N)回伸びる。
    –   全体としてはO(Q・√N+2N√N)=O((Q+2N)√N)
    –   √(2N)をバケットにすると、O((Q+N)√(2N))になる?。こっちのほうが
        はやいらしい
補足
●   何の断りも無しに左右端を伸ばしたりするアイデアを説明したけ
    ど、イメージとしては尺取法みたいにうにょうにょする感じ
●
    ほかには、この解法でやるとき、
    –   ある数aを取り除くときハッシュ値にa(列中のaの出現数)を引けばよい
    –   ある数aを追加するときaハッシュ値にa(列中のaの出現数+1)を足せばよい
●   ということを補足しておきます。
なぜかTLEした人たちへ
●   余り取るのとかメチャクチャ遅いので、%の数を
    ソースから減らすだけで数秒単位で高速化できま
    す。オススメ。
罠(にしたかった)
●   Pは素数ですが、Pと互いに素じゃない数が含まれている場合、割
    り算定義出来ないので、先に逆元求めて色々しようとしている人
    は破綻してほしかったけどうまくいくらしいです

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
 
abc031
abc031abc031
abc031
 
Pyramid
PyramidPyramid
Pyramid
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
競技プログラミングの楽しみ
競技プログラミングの楽しみ競技プログラミングの楽しみ
競技プログラミングの楽しみ
 
Arc041
Arc041Arc041
Arc041
 
計算量
計算量計算量
計算量
 
Rsa暗号で彼女が出来るらしい
Rsa暗号で彼女が出来るらしいRsa暗号で彼女が出来るらしい
Rsa暗号で彼女が出来るらしい
 
公開鍵暗号1: RSA暗号
公開鍵暗号1: RSA暗号公開鍵暗号1: RSA暗号
公開鍵暗号1: RSA暗号
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説AtCoder Regular Contest 021 解説
AtCoder Regular Contest 021 解説
 
1
11
1
 
AtCoder Regular Contest 036 解説
AtCoder Regular Contest 036 解説AtCoder Regular Contest 036 解説
AtCoder Regular Contest 036 解説
 
abc027
abc027abc027
abc027
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
 
RUPC2014_Day2_I
RUPC2014_Day2_IRUPC2014_Day2_I
RUPC2014_Day2_I
 
動的計画法
動的計画法動的計画法
動的計画法
 
Sharp2sat
Sharp2satSharp2sat
Sharp2sat
 

Andere mochten auch

マラソンマッチ 89 日記
マラソンマッチ 89 日記マラソンマッチ 89 日記
マラソンマッチ 89 日記Kazuma Mikami
 
パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋Kazuma Mikami
 
セグツリーイメージ
セグツリーイメージセグツリーイメージ
セグツリーイメージKazuma Mikami
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろKazuma Mikami
 
部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎Kazuma Mikami
 
やさしい整数論
やさしい整数論やさしい整数論
やさしい整数論Kazuma Mikami
 

Andere mochten auch (6)

マラソンマッチ 89 日記
マラソンマッチ 89 日記マラソンマッチ 89 日記
マラソンマッチ 89 日記
 
パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋
 
セグツリーイメージ
セグツリーイメージセグツリーイメージ
セグツリーイメージ
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
 
部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎
 
やさしい整数論
やさしい整数論やさしい整数論
やさしい整数論
 

Ähnlich wie K2PC Div1 E 暗号化

AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Inc.
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説AtCoder Inc.
 
PRML 1.6 情報理論
PRML 1.6 情報理論PRML 1.6 情報理論
PRML 1.6 情報理論sleepy_yoshi
 
Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法Nagi Teramo
 
K070k80 点推定 区間推定
K070k80 点推定 区間推定K070k80 点推定 区間推定
K070k80 点推定 区間推定t2tarumi
 
Kth
KthKth
Kthoupc
 
070 統計的推測 母集団と推定
070 統計的推測 母集団と推定070 統計的推測 母集団と推定
070 統計的推測 母集団と推定t2tarumi
 
Computing for Isogeny Kernel Problem by Groebner Basis
Computing for Isogeny Kernel Problem by Groebner BasisComputing for Isogeny Kernel Problem by Groebner Basis
Computing for Isogeny Kernel Problem by Groebner BasisYasu Math
 
JOI本選 夜店(NightMarket)解説
JOI本選 夜店(NightMarket)解説JOI本選 夜店(NightMarket)解説
JOI本選 夜店(NightMarket)解説Hiroshi Yamashita
 
2013computer s1
2013computer s12013computer s1
2013computer s1munich1502
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valueUniversity CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valuesatanic
 
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜Tomoki Yoshida
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3noname409
 
130323 slide all
130323 slide all130323 slide all
130323 slide allikea0064
 
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++sleepy_yoshi
 
How to study stat
How to study statHow to study stat
How to study statAk Ok
 

Ähnlich wie K2PC Div1 E 暗号化 (20)

AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
ARC#003D
ARC#003DARC#003D
ARC#003D
 
PRML 1.6 情報理論
PRML 1.6 情報理論PRML 1.6 情報理論
PRML 1.6 情報理論
 
Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法Rで学ぶ逆変換(逆関数)法
Rで学ぶ逆変換(逆関数)法
 
K070k80 点推定 区間推定
K070k80 点推定 区間推定K070k80 点推定 区間推定
K070k80 点推定 区間推定
 
Kth
KthKth
Kth
 
070 統計的推測 母集団と推定
070 統計的推測 母集団と推定070 統計的推測 母集団と推定
070 統計的推測 母集団と推定
 
Aizu-2017: B
Aizu-2017: BAizu-2017: B
Aizu-2017: B
 
Computing for Isogeny Kernel Problem by Groebner Basis
Computing for Isogeny Kernel Problem by Groebner BasisComputing for Isogeny Kernel Problem by Groebner Basis
Computing for Isogeny Kernel Problem by Groebner Basis
 
JOI本選 夜店(NightMarket)解説
JOI本選 夜店(NightMarket)解説JOI本選 夜店(NightMarket)解説
JOI本選 夜店(NightMarket)解説
 
2013computer s1
2013computer s12013computer s1
2013computer s1
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valueUniversity CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3
 
130323 slide all
130323 slide all130323 slide all
130323 slide all
 
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
TokyoNLP#7 きれいなジャイアンのカカカカ☆カーネル法入門-C++
 
How to study stat
How to study statHow to study stat
How to study stat
 

K2PC Div1 E 暗号化

  • 1. E - 暗号化(Encipherment) 原案 : kyuridenamida テスター : fura2,chokudai?
  • 2. 統計 ● First Acceptance iwiwi(75:11) ● 完答数 / 提出数 = 2 / 45 正答率: 4.4% ● 部分点(500)最初に手に入れた人 みけCAT(59:36)
  • 3. 問題 ● 長さ10万の数列が与えられる ● その数列の連続した部分列に対して、  Pを素数とする. ハッシュ化する列を {x1,x2,x3,…,xn} とし, 全 ての xiについて, j≦ iかつ xj=xiが成り立つような jの個数をCiと すると, (ハッシュ値) = ΣxiCi mod P ● という風にハッシュ値を求めるだけの問題。
  • 4. 部分点(20%) ● 数列中の数は全て異なる⇔常にCiは1 ● つまり、 (ハッシュ値) = Σxi mod P ● これは累積和を使えば 前計算O(N) 1つのクエリ処理O(1) 全体としてはO(N+Q) ● すごく簡単。
  • 5. 考察 ● 部分列の特定の数(aとする)だけに着目すれば、      a1 + a2 + … + a(aが列中に存在する個数) がハッシュ値に足されている。 ● クエリは出力順だけ正しければ、どういう順番に 処理しても構わない。
  • 6. クエリ処理のメインアイデア ● もしクエリが(始点,終点)のペアでソートされてたら (1,2) , (1,5) , (1,7) , (2,1) , (2,2) , … ● みたいな感じになる。 ● 始点が同じやつはまとめて処理できるので嬉しい – なぜかというと、たとえば (1,2)の結果がもとまっているとして、 (1,5)の結果はそれの右端を3伸ばしたものであり、 (1,7)の結果はさらに右端を2伸ばしたものだから。 ● しかし始点が全て異なる場合やはりクエリ処理全体でO(NQ)か かってしまう。
  • 7. 計算量改善(間違いだらけかも) ● そこで、始点を√n個程度のバケットに分けて、 (始点が含まれるバケットの番号,終点) のペアでソートすると、以下のことが分かる。 – さっきは右端しか伸びなかったが、今回は左端が伸びたり縮んだり する可能性がある。  – ↑について、バケット内での1つの要素について、O(√n)回左端が 伸びたり縮んだりする。 – それ以外の部分で、1つのバケットにつき後ろがO(N)回伸びる。前 もO(N)回伸びる。つまり前後が,O(2N√N)回伸びる。 – 全体としてはO(Q・√N+2N√N)=O((Q+2N)√N) – √(2N)をバケットにすると、O((Q+N)√(2N))になる?。こっちのほうが はやいらしい
  • 8. 補足 ● 何の断りも無しに左右端を伸ばしたりするアイデアを説明したけ ど、イメージとしては尺取法みたいにうにょうにょする感じ ● ほかには、この解法でやるとき、 – ある数aを取り除くときハッシュ値にa(列中のaの出現数)を引けばよい – ある数aを追加するときaハッシュ値にa(列中のaの出現数+1)を足せばよい ● ということを補足しておきます。
  • 9. なぜかTLEした人たちへ ● 余り取るのとかメチャクチャ遅いので、%の数を ソースから減らすだけで数秒単位で高速化できま す。オススメ。
  • 10. 罠(にしたかった) ● Pは素数ですが、Pと互いに素じゃない数が含まれている場合、割 り算定義出来ないので、先に逆元求めて色々しようとしている人 は破綻してほしかったけどうまくいくらしいです