Petitverse
ゲストさん (
ログイン
)
ログイン
コミュニティ内検索
コミュニティ一覧
Petitverse ご利用ガイド
Petitverse からのおしらせ
プチコン 非公式コミュニティ
プレイ日記
こういち
◆ou0jbJnEJ0Kb
2019/8/28 9:39
問題
サンタさんは、自分の副業が空き巣だということを皆に打ち明けようと思っています。
任意の人に自分の正体を打ち明けたとき、その人は1/Nの格率で絶望し、サンタさんのファンをやめてしまいます。
M人に正体を打ち明けたとき、サンタさんのファンが一人も減らない確率の逆数を32768で割った余りを求めてください。
コメント
こういち
2019/8/28 12:02 ネタバレ
◆ou0jbJnEJ0Kb
N*(N-1)
の部分が実数なのが厄介。
切り捨てれば誤差が蓄積し、NのM乗を計算してからN-1のM乗で割ろうとすると、逆元とやらが必要になるかもしれん…
このコメントはネタバレを含んでいます。
このコメントをひらく
高原のな
2019/8/28 13:24 ネタバレ
◆bY8RViwvoODw
(分母分子を別に計算して、後から統合するという戦略を組んでみるが、このアプローチは正しいとは言いがたいかもしれない)
POW(1-(1/N),M)
逆数前の分母=N^M
逆数前の分子=(N-1)^M
(Nが整数であるならば、ここで整数の合同とN≦20さらには帯分数の発想を活用して、20要素程度の配列を用いることによって比較的小さい数値と現実的な計算時間(配列を使わないとMがめっちゃでかいときに簡単にタイムオーバーする)で計算を済ませることが可能で、実数ならばNを分数で表し直すことで突破口が開けるかもわからん。Mは問題文から考えて整数で当然だろう。夜に時間があったら続きをする)
このコメントはネタバレを含んでいます。
このコメントをひらく
Na
2019/8/28 13:30
◆QoELVrBXBQCI
できました!
A=1
FOR I=1 TO M
A=A*N/(N-1)
A=A-FLOOR(A/32768)*32768
NEXT
?A
こういち
2019/8/28 13:48 ネタバレ
◆ou0jbJnEJ0Kb
Naさん
(多分)正解です。
大幅な高速化が出来たりするので、余裕があれば挑戦してみてもいいでしょう。
このコメントはネタバレを含んでいます。
このコメントをひらく
高原のな
2019/8/28 13:58 ネタバレ
◆bY8RViwvoODw
(試してみましたが、Mが比較的小さい時は誤差が無視できるくらい(PRINTでは表示できないくらい)小さいのですが、Mが大きくなってくるとだいぶ誤差が広がるようで、Nが割と小さい時はMが40付近から精度不足って感じになってきます。比較はWolfram Alphaで行いました)
このコメントはネタバレを含んでいます。
このコメントをひらく
ジプッチャ
2019/8/28 16:38
◆tkYhkmSxSAam
そういう問題を夢で思いつくのか…すごいな
ツララ
2019/8/28 18:09
◆ArUdBYOYME1V
最終的に確率が知りたいのなら分数の形で出力されるようにすればいいんじゃないんです?
実数を割った時の余剰を知りたいのなら
まず整数部分で余剰を出して、その後に小数点以下部分を足せばいいんじゃないんです?
サンタクロースの副業が空き巣だったっていうのを夢占い的に判断すると
どういうことなんでしょうかね?
最近人間不信に陥るような出来事があったとか?
シルエットクイズに凝ってるとか?
Na
2019/8/28 19:19
◆QoELVrBXBQCI
>ツララさん
20億乗もしたら分子も分母もinfになってしまうので分数では表せません。
配列とか使って大きい桁でも計算できるように工夫しないとですね。
→
https://ja.wikipedia.org/wiki/%E4%BB%BB%E6%84%8F%E7%B2%BE%E5%BA%A6%E6%BC%94%E7%AE%97
整数部分の剰余を出そうにもMODやANDは整数型の範囲(約20億)を超えるとOverflowしてしまいます。
高原のな
2019/8/28 20:48 ネタバレ
◆bY8RViwvoODw
プチコンには標準で分数計算ができるものがないし、演算子をオーバーロードできるクラスみたいなものもないので、どうあがいてもスッキリは書けないので、こういう時は泥臭く書いて完成を目指すのです。いつもならプチコンなりパソコンなりに向かって一気に書き上げていくのですが、今日はなんかそういう風にしていないので、方針をタラタラ書くばかりです。プチコンはスプライト指向言語(社長談)ですからそれをうまく活用してもいいでしょう(今回はしないつもりです)。
<方針>
・求める値は実質的に「(N/N-1)^Mを32768で割った余り」です(これはNaさんが示しているとおりです)。
・これをいくつかの変数を用いて分数で表します。なお、ここで分母分子共にあえて倍精度浮動小数を用いて整数表現をすることにすると、2^53 = 9007199254740992 ≒ 9.0*10^15までは正確に表現できるので、変数の数を減らすのに活用できるかもしれません。が、とりあえずは整数型のつもり
・帯分数を用いることで分子が小さくできます。おまけに32768で割った余りを求めるのも多少簡単になります(これはツララさんが言及していますね)。ただ、分数のかけ算なので実装が一筋縄ではいかないかも(ちょっと考えたらすぐ解決しますが)。ただ、分母はめっちゃでかくなるのは変わりなく、これを正確に保持しないといけません。ここの解決策がががが。
・とりあえず他の言語で一度書き起こして、なんども手動変換してプチコンで書けるよう書けるように変換するって手も考えてます。
・実は、手元にこういう問題(とても桁数の多い数の加減乗除)を扱うアルゴリズムが例として載っている本があるので、手詰まりになった時と最後まで書きあがって投稿した後には見て、共有知にしたいと思います。
このコメントはネタバレを含んでいます。
このコメントをひらく
SatoshiMcCloud
2019/8/30 1:23
◆Z1qfV11i63Jr
指数対数を使って考えてみました。
画像ではN=5、M=7のパターンを試しに計算してますが、他のもっと大きいパターンも試してみたい…試した上で正しいか検証したい…
SatoshiMcCloud
2019/8/30 1:25
◆Z1qfV11i63Jr
画像の貼り忘れ
こういち
2019/8/30 17:47
◆ou0jbJnEJ0Kb
ツララさん
Naさんや高原のなさんのコメントにもある通り分数でも厳しいかと。
サンタさんが空き巣なのは子供の頃から思ってました。
SatoshiMcCloud
新しいの来た。期待。
こういち
2019/8/30 17:48 ネタバレ
◆ou0jbJnEJ0Kb
逆元について調べてみた。
割る数が素数だった場合の逆元は容易に求めることが可能らしい。
…素数にすればよかった。
このコメントはネタバレを含んでいます。
このコメントをひらく
SatoshiMcCloud
2019/8/30 18:46
◆Z1qfV11i63Jr
剰余と指数の関係を勘違いしてるらしく、検算したら全然違う結果になりました…もうちょい考えます
高原のな
2019/8/30 19:07
◆bY8RViwvoODw
暇ができないようでできたので、とりあえず他言語で実装してみます
どんなコードが仕上がるか楽しみです(つらそう)
C++を利用予定です(気が変わってC#になりました)。これをプチコンに変換して戻ってきたとき、Wolfram Alphaさんと計算結果が小数点以下3位まで揃ったら勝ちってことで
SatoshiMcCloud
2019/8/30 19:17
◆Z1qfV11i63Jr
とりあえず分かりやすいパターンから攻める。
N=2の場合、M<15なら余りは2のM乗、15<=Mなら余りは0
高原のな
2019/8/30 19:24
◆bY8RViwvoODw
(SatoshiMcCloudさんの様子を見て思ったのだが、上手な素因数分解ができれば肥大化が防げるかも。
わたしのアプローチでは、Nが整数なら勝ち確定で、Nが実数ならまだゴリ押し実装しないと何もわからん)
SatoshiMcCloud
2019/8/30 19:36
◆Z1qfV11i63Jr
(のなさんの書き込みで大事なことに気がついた。文面の限りじゃNが整数とは限らないじゃん…そうなるとN=2以外はゴリ押しするほか思いつかないなあ)
SatoshiMcCloud
2019/8/30 19:46
◆Z1qfV11i63Jr
2<Nの場合について
高原のな
2019/8/30 19:47
◆bY8RViwvoODw
SatoshiMcCloudさん>
N=2に限らず、N=2^k(Nの範囲より1≦k≦4, kは整数)というパターンはゴリ押しでなくてもなんとかなりそうです。
N*(N-1)が実数という発言があるので、Nは実数と捉えるのが妥当かなと
1
2
3
コメントを書く
こちらは「プチコン3号」「プチコンBIG」など、
プチコンシリーズ
に関する話題を扱った
コミュニティです
プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
ユーザー登録なしで書き込みができます
秘密の合い言葉は成りすましの防止 (
トリップ機能
)、書き込みの編集時の本人認証に使用します
秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります
normal
happy
like
surprized
frustrated
puzzled
画像
ネタバレ
投稿する
-
WEB PATIO
-