狠狠撸

狠狠撸Share a Scribd company logo
四則演算




原案、問題文:宮村
解答:宮村、橋本
 解説:宮村
問題概要



   数が N(≦10^5) 個与えられるので、足したり引いた
    り掛けたり割ったりして、最後の値を答えなさい。
   ただし計算結果は -2^31 以上 2^31 未満の整数に
    なることが保証されている。
ナイーブな解法


   Double 型などの浮動小数点数で近似する?
   誤差やオーバーフロー、アンダーフローで WA 。

   多倍長整数を用いて有理数の計算を実装する ?
   多倍長整数の計算は時間計算量も空間計算量も
    O(1) ではないので TLE する。
着眼点



   答えは -2^31 以上 2^31 未満の整数になることが
    保証されていることに目をつける。
   答えはたかだか 2^32 通りしかない。
解法


   例えば、 2^32 より大きな素数 p をひとつ固定し
    て、 MOD p で計算することにしてみよう。
   割り算は、 x / y = x * y^(p-2) で計算する
    ( フェルマーの小定理 ) 。
解法

   MOD p で計算した結果、 X[N]=z になったとする。
    1. 0≦z≦2^31-1 になったら z が答。
    2. 2^31≦z なら z-p が答。

-2^31     0       2^31   p-2^31   p          Z



                                      Z/pZ
証明

   Q[p] = {x in Q ; x = a/b となるような整数 a, b が
    存在する。ただし b は p の倍数でない }
   このとき、 Q[p] は和や積について閉じている。
    ( 分母に p を含まない数同士の足し算や掛け算で
     新しく分母に p が出てくることはない )
   |Y[i]| ≦ 10^6 なので、 X[i] in Q[p] になる。
証明
   f を Q[p] から Z/pZ への写像で、 x = a/b(a,b は整
    数、 b は p の倍数でない ) を a*b^(p-2) に写すもの
    とする、つまり
    f(a/b) = a * b^(p-2)
   この関数は well-defined であることが示せる。
    つまり x=a/b の表し方は複数あるが、どのように表
    したとしても行き先は変わらない。
証明

   写像 f は以下の性質を満たす。
    1. f(x + y) = f(x) + f(y)
    2. f(x * y) = f(x) * f(y)
   これは計算することにより簡単に確かめることがで
    きる。
証明

   この性質を満たすと何が嬉しいのか?
   減算や除算は加算や乗算で置き換えて考える。
   f(X[N]) = f(X[N-1] op[N] Y[N])
           = f(X[N-1]) op[N] f(Y[N])
           = f(X[N-2] op[N-1] Y[N-1]) op[N] f(Y[N])
           = f(X[N-2]) op[N-1] f(Y[N-1]) op[N] f(Y[N])
           …
           = f(X[0]) op[1] f(Y[1]) … op[N] f(Y[N])
   これで全て MOD p で考えてよいことが示された。
実装上の注意

   p は 2^32 より大きい素数である必要があるので、
    積をとるときオーバーフローする可能性がある。
   オーバーフローを回避しなければならない。

   Java で BigInteger を使ってもよい。
    意外に早くて十分に間に合う。
    modInverse(mod) という便利なメソッドが…
実装上の注意

   多倍長整数を使わなくてもオーバーフローは回避
    できる。
   掛け算をバイナリ法で実装しなおす ?
     → 計算量 O(N* (log p)^2) でやや重い。
        通すには定数倍最適化が必要。
   p を 10^12 以下にとれば、 M を 10^6 程度にとり、
    x * y = ((x * (y / M) % p)*M + x * (y % M)) % p
    とすることでオーバーフローを回避できる。
別解

   オンサイト参加された exPacks さんの解法。

   オーバーフローしない程度の大きさ (10^8 とか ) の
    素数を 2 つ用意する。 (P, Q とおく )
   X[N] を mod P, mod Q で計算する。
   中国剰余定理で X[N] mod P*Q を計算する。
応用例


   整数の行列が与えられて行列式を計算したいとき、
    掃き出し法を適用するときに除算が楽に実装でき
    る。
   最終的に整数になることが分かっている有理数が
    楽に扱えてうれしいことがあるかもしれない。
応用問題 ?
   この問題の input validator を作れ。
   つまり、この問題の計算結果がきちんと signed
    32bit int の範囲に収まる整数になっているかどうか
    確かめよ。

   乱択アルゴリズムを用いることにより高い確率で確
    かめることができる?
   適当に素数 p をとって計算結果 z が
    2^31≦z<p-2^31 となったら棄却できる。
   いろんな素数で試せば OK ?
解答例

   宮村: C++
     60 行 773byte

   橋本: Java (BigInteger を使用 )
     29 行 776byte

More Related Content

What's hot (17)

Permutation
PermutationPermutation
Permutation
oupc
?
Seminar on Quantum Computation & Quantum Information part19
Seminar on Quantum Computation & Quantum Information part19Seminar on Quantum Computation & Quantum Information part19
Seminar on Quantum Computation & Quantum Information part19
Yuichi Adachi
?
ロマ数16 simizut
ロマ数16 simizutロマ数16 simizut
ロマ数16 simizut
Tatsuki SHIMIZU
?
Joi模擬予選2013 6番解説
Joi模擬予選2013 6番解説Joi模擬予選2013 6番解説
Joi模擬予選2013 6番解説
DEGwer
?
Estimating Mutual Information for Discrete‐Continuous Mixtures 離散?連続混合の相互情報量の推定
Estimating Mutual Information for Discrete‐Continuous Mixtures 離散?連続混合の相互情報量の推定Estimating Mutual Information for Discrete‐Continuous Mixtures 離散?連続混合の相互情報量の推定
Estimating Mutual Information for Discrete‐Continuous Mixtures 離散?連続混合の相互情報量の推定
Yuya Takashina
?
搁鲍笔颁2017:叠の解説
搁鲍笔颁2017:叠の解説搁鲍笔颁2017:叠の解説
搁鲍笔颁2017:叠の解説
Takumi Yamashita
?
公開鍵暗号2: NP困難性
公開鍵暗号2: NP困難性公開鍵暗号2: NP困難性
公開鍵暗号2: NP困難性
Joe Suzuki
?
会津合宿2015顿补测3:顿问题
会津合宿2015顿补测3:顿问题会津合宿2015顿补测3:顿问题
会津合宿2015顿补测3:顿问题
HCPC: 北海道大学競技プログラミングサークル
?
ハウスドルフと闭グラフ
ハウスドルフと闭グラフハウスドルフと闭グラフ
ハウスドルフと闭グラフ
政孝 鍋島
?
JSIAM_2019_9_4
JSIAM_2019_9_4JSIAM_2019_9_4
JSIAM_2019_9_4
KoutaFunakoshi
?
Donuts プロコンチャレンジ2014
Donuts プロコンチャレンジ2014Donuts プロコンチャレンジ2014
Donuts プロコンチャレンジ2014
kuno4n
?
Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方
Masaru Watanabe
?
楕円形の连结を使った最小値问题
楕円形の连结を使った最小値问题楕円形の连结を使った最小値问题
楕円形の连结を使った最小値问题
政孝 鍋島
?
楕円形の连结を使った最小値问题
楕円形の连结を使った最小値问题楕円形の连结を使った最小値问题
楕円形の连结を使った最小値问题
nabeshimamasataka
?
动的计画法を极める!
动的计画法を极める!动的计画法を极める!
动的计画法を极める!
HCPC: 北海道大学競技プログラミングサークル
?
Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説
kuno4n
?
Permutation
PermutationPermutation
Permutation
oupc
?
Seminar on Quantum Computation & Quantum Information part19
Seminar on Quantum Computation & Quantum Information part19Seminar on Quantum Computation & Quantum Information part19
Seminar on Quantum Computation & Quantum Information part19
Yuichi Adachi
?
Joi模擬予選2013 6番解説
Joi模擬予選2013 6番解説Joi模擬予選2013 6番解説
Joi模擬予選2013 6番解説
DEGwer
?
Estimating Mutual Information for Discrete‐Continuous Mixtures 離散?連続混合の相互情報量の推定
Estimating Mutual Information for Discrete‐Continuous Mixtures 離散?連続混合の相互情報量の推定Estimating Mutual Information for Discrete‐Continuous Mixtures 離散?連続混合の相互情報量の推定
Estimating Mutual Information for Discrete‐Continuous Mixtures 離散?連続混合の相互情報量の推定
Yuya Takashina
?
搁鲍笔颁2017:叠の解説
搁鲍笔颁2017:叠の解説搁鲍笔颁2017:叠の解説
搁鲍笔颁2017:叠の解説
Takumi Yamashita
?
公開鍵暗号2: NP困難性
公開鍵暗号2: NP困難性公開鍵暗号2: NP困難性
公開鍵暗号2: NP困難性
Joe Suzuki
?
ハウスドルフと闭グラフ
ハウスドルフと闭グラフハウスドルフと闭グラフ
ハウスドルフと闭グラフ
政孝 鍋島
?
Donuts プロコンチャレンジ2014
Donuts プロコンチャレンジ2014Donuts プロコンチャレンジ2014
Donuts プロコンチャレンジ2014
kuno4n
?
Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方
Masaru Watanabe
?
楕円形の连结を使った最小値问题
楕円形の连结を使った最小値问题楕円形の连结を使った最小値问题
楕円形の连结を使った最小値问题
政孝 鍋島
?
楕円形の连结を使った最小値问题
楕円形の连结を使った最小値问题楕円形の连结を使った最小値问题
楕円形の连结を使った最小値问题
nabeshimamasataka
?
Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説
kuno4n
?

Viewers also liked (8)

Division
DivisionDivision
Division
oupc
?
Palin
PalinPalin
Palin
oupc
?
Onde houver féOnde houver fé
Onde houver fé
Eduardo Maciel
?
Icr s700 rm-om_frenchIcr s700 rm-om_french
Icr s700 rm-om_french
Dorothy Changeditcuzihadto
?
Sharp2sat
Sharp2satSharp2sat
Sharp2sat
oupc
?
Division
DivisionDivision
Division
oupc
?
Palin
PalinPalin
Palin
oupc
?
Onde houver féOnde houver fé
Onde houver fé
Eduardo Maciel
?
Icr s700 rm-om_frenchIcr s700 rm-om_french
Icr s700 rm-om_french
Dorothy Changeditcuzihadto
?
Sharp2sat
Sharp2satSharp2sat
Sharp2sat
oupc
?

Similar to Four op (20)

平方剰余
平方剰余平方剰余
平方剰余
Arisa Niitsuma
?
【鲍苍颈迟测道场】ゲーム制作に使う数学を学习しよう
【鲍苍颈迟测道场】ゲーム制作に使う数学を学习しよう【鲍苍颈迟测道场】ゲーム制作に使う数学を学习しよう
【鲍苍颈迟测道场】ゲーム制作に使う数学を学习しよう
Unity Technologies Japan K.K.
?
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説
AtCoder Inc.
?
これは楽しい数学マジック(その1)
これは楽しい数学マジック(その1)これは楽しい数学マジック(その1)
これは楽しい数学マジック(その1)
神戸大学
?
公開鍵暗号5: 離散対数問題
公開鍵暗号5: 離散対数問題公開鍵暗号5: 離散対数問題
公開鍵暗号5: 離散対数問題
Joe Suzuki
?
[Basic 14] 暗号について / RSA 暗号 / 楕円曲線暗号
[Basic 14] 暗号について / RSA 暗号 / 楕円曲線暗号[Basic 14] 暗号について / RSA 暗号 / 楕円曲線暗号
[Basic 14] 暗号について / RSA 暗号 / 楕円曲線暗号
Yuto Takei
?
Math20160415 epsilondelta
Math20160415 epsilondeltaMath20160415 epsilondelta
Math20160415 epsilondelta
Atsushi Kadotani
?
指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端
Yoichi Iwata
?
虫镑2+苍测镑2の形で表せる素数の法则と类体论
虫镑2+苍测镑2の形で表せる素数の法则と类体论虫镑2+苍测镑2の形で表せる素数の法则と类体论
虫镑2+苍测镑2の形で表せる素数の法则と类体论
Junpei Tsuji
?
AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Regular Contest 017
AtCoder Regular Contest 017
AtCoder Inc.
?
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
AtCoder Inc.
?
秘密分散法の数理
秘密分散法の数理秘密分散法の数理
秘密分散法の数理
Akito Tabira
?
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながり
MITSUNARI Shigeo
?
多倍长整数の乗算と高速フーリエ変换
多倍长整数の乗算と高速フーリエ変换多倍长整数の乗算と高速フーリエ変换
多倍长整数の乗算と高速フーリエ変换
京大 マイコンクラブ
?
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valueUniversity CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
satanic
?
2012年1月20日
2012年1月20日2012年1月20日
2012年1月20日
nukaemon
?
素数判定法
素数判定法素数判定法
素数判定法
DEGwer
?
Sch?nhage Strassen Algorithm
Sch?nhage Strassen AlgorithmSch?nhage Strassen Algorithm
Sch?nhage Strassen Algorithm
cookies 146
?
【鲍苍颈迟测道场】ゲーム制作に使う数学を学习しよう
【鲍苍颈迟测道场】ゲーム制作に使う数学を学习しよう【鲍苍颈迟测道场】ゲーム制作に使う数学を学习しよう
【鲍苍颈迟测道场】ゲーム制作に使う数学を学习しよう
Unity Technologies Japan K.K.
?
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説
AtCoder Inc.
?
これは楽しい数学マジック(その1)
これは楽しい数学マジック(その1)これは楽しい数学マジック(その1)
これは楽しい数学マジック(その1)
神戸大学
?
公開鍵暗号5: 離散対数問題
公開鍵暗号5: 離散対数問題公開鍵暗号5: 離散対数問題
公開鍵暗号5: 離散対数問題
Joe Suzuki
?
[Basic 14] 暗号について / RSA 暗号 / 楕円曲線暗号
[Basic 14] 暗号について / RSA 暗号 / 楕円曲線暗号[Basic 14] 暗号について / RSA 暗号 / 楕円曲線暗号
[Basic 14] 暗号について / RSA 暗号 / 楕円曲線暗号
Yuto Takei
?
指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端
Yoichi Iwata
?
虫镑2+苍测镑2の形で表せる素数の法则と类体论
虫镑2+苍测镑2の形で表せる素数の法则と类体论虫镑2+苍测镑2の形で表せる素数の法则と类体论
虫镑2+苍测镑2の形で表せる素数の法则と类体论
Junpei Tsuji
?
AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Regular Contest 017
AtCoder Regular Contest 017
AtCoder Inc.
?
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
AtCoder Inc.
?
秘密分散法の数理
秘密分散法の数理秘密分散法の数理
秘密分散法の数理
Akito Tabira
?
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながり
MITSUNARI Shigeo
?
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valueUniversity CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
satanic
?
2012年1月20日
2012年1月20日2012年1月20日
2012年1月20日
nukaemon
?
素数判定法
素数判定法素数判定法
素数判定法
DEGwer
?
Sch?nhage Strassen Algorithm
Sch?nhage Strassen AlgorithmSch?nhage Strassen Algorithm
Sch?nhage Strassen Algorithm
cookies 146
?

More from oupc (18)

Comment
CommentComment
Comment
oupc
?
Magical
MagicalMagical
Magical
oupc
?
Replace
ReplaceReplace
Replace
oupc
?
Sanpo
SanpoSanpo
Sanpo
oupc
?
Paren
ParenParen
Paren
oupc
?
Segpair
SegpairSegpair
Segpair
oupc
?
Knapsack
KnapsackKnapsack
Knapsack
oupc
?
Divisor
DivisorDivisor
Divisor
oupc
?
Anagram
AnagramAnagram
Anagram
oupc
?
Comment
CommentComment
Comment
oupc
?
Comment
CommentComment
Comment
oupc
?
Magical
MagicalMagical
Magical
oupc
?
Replace
ReplaceReplace
Replace
oupc
?
Sanpo
SanpoSanpo
Sanpo
oupc
?
Paren
ParenParen
Paren
oupc
?
Segpair
SegpairSegpair
Segpair
oupc
?
Knapsack
KnapsackKnapsack
Knapsack
oupc
?
Divisor
DivisorDivisor
Divisor
oupc
?
Anagram
AnagramAnagram
Anagram
oupc
?
Comment
CommentComment
Comment
oupc
?

Four op

  • 2. 問題概要  数が N(≦10^5) 個与えられるので、足したり引いた り掛けたり割ったりして、最後の値を答えなさい。  ただし計算結果は -2^31 以上 2^31 未満の整数に なることが保証されている。
  • 3. ナイーブな解法  Double 型などの浮動小数点数で近似する?  誤差やオーバーフロー、アンダーフローで WA 。  多倍長整数を用いて有理数の計算を実装する ?  多倍長整数の計算は時間計算量も空間計算量も O(1) ではないので TLE する。
  • 4. 着眼点  答えは -2^31 以上 2^31 未満の整数になることが 保証されていることに目をつける。  答えはたかだか 2^32 通りしかない。
  • 5. 解法  例えば、 2^32 より大きな素数 p をひとつ固定し て、 MOD p で計算することにしてみよう。  割り算は、 x / y = x * y^(p-2) で計算する ( フェルマーの小定理 ) 。
  • 6. 解法  MOD p で計算した結果、 X[N]=z になったとする。 1. 0≦z≦2^31-1 になったら z が答。 2. 2^31≦z なら z-p が答。 -2^31 0 2^31 p-2^31 p Z Z/pZ
  • 7. 証明  Q[p] = {x in Q ; x = a/b となるような整数 a, b が 存在する。ただし b は p の倍数でない }  このとき、 Q[p] は和や積について閉じている。 ( 分母に p を含まない数同士の足し算や掛け算で  新しく分母に p が出てくることはない )  |Y[i]| ≦ 10^6 なので、 X[i] in Q[p] になる。
  • 8. 証明  f を Q[p] から Z/pZ への写像で、 x = a/b(a,b は整 数、 b は p の倍数でない ) を a*b^(p-2) に写すもの とする、つまり f(a/b) = a * b^(p-2)  この関数は well-defined であることが示せる。 つまり x=a/b の表し方は複数あるが、どのように表 したとしても行き先は変わらない。
  • 9. 証明  写像 f は以下の性質を満たす。 1. f(x + y) = f(x) + f(y) 2. f(x * y) = f(x) * f(y)  これは計算することにより簡単に確かめることがで きる。
  • 10. 証明  この性質を満たすと何が嬉しいのか?  減算や除算は加算や乗算で置き換えて考える。  f(X[N]) = f(X[N-1] op[N] Y[N]) = f(X[N-1]) op[N] f(Y[N]) = f(X[N-2] op[N-1] Y[N-1]) op[N] f(Y[N]) = f(X[N-2]) op[N-1] f(Y[N-1]) op[N] f(Y[N]) … = f(X[0]) op[1] f(Y[1]) … op[N] f(Y[N])  これで全て MOD p で考えてよいことが示された。
  • 11. 実装上の注意  p は 2^32 より大きい素数である必要があるので、 積をとるときオーバーフローする可能性がある。  オーバーフローを回避しなければならない。  Java で BigInteger を使ってもよい。 意外に早くて十分に間に合う。 modInverse(mod) という便利なメソッドが…
  • 12. 実装上の注意  多倍長整数を使わなくてもオーバーフローは回避 できる。  掛け算をバイナリ法で実装しなおす ? → 計算量 O(N* (log p)^2) でやや重い。 通すには定数倍最適化が必要。  p を 10^12 以下にとれば、 M を 10^6 程度にとり、 x * y = ((x * (y / M) % p)*M + x * (y % M)) % p とすることでオーバーフローを回避できる。
  • 13. 別解  オンサイト参加された exPacks さんの解法。  オーバーフローしない程度の大きさ (10^8 とか ) の 素数を 2 つ用意する。 (P, Q とおく )  X[N] を mod P, mod Q で計算する。  中国剰余定理で X[N] mod P*Q を計算する。
  • 14. 応用例  整数の行列が与えられて行列式を計算したいとき、 掃き出し法を適用するときに除算が楽に実装でき る。  最終的に整数になることが分かっている有理数が 楽に扱えてうれしいことがあるかもしれない。
  • 15. 応用問題 ?  この問題の input validator を作れ。  つまり、この問題の計算結果がきちんと signed 32bit int の範囲に収まる整数になっているかどうか 確かめよ。  乱択アルゴリズムを用いることにより高い確率で確 かめることができる?  適当に素数 p をとって計算結果 z が 2^31≦z<p-2^31 となったら棄却できる。  いろんな素数で試せば OK ?
  • 16. 解答例  宮村: C++ 60 行 773byte  橋本: Java (BigInteger を使用 ) 29 行 776byte