1. 競プロする人
  2. AtCoder Beginner Contest 174
2024-01-02 12:28

AtCoder Beginner Contest 174

AtCoder Beginner Contest 174

https://atcoder.jp/contests/abc174


↓の提出コードを見ながらの聴取を推奨いたします
A:https://atcoder.jp/contests/abc174/submissions/46420470

B:https://atcoder.jp/contests/abc174/submissions/46420515


Atcoderホームページ:https://atcoder.jp/home

サマリー

AtCoder Beginner Contest 174回目では、A問題では室温の条件判断が行われています。B問題では、2次元平面上での座標計算が行われています。また、C問題では、倍数と好きな数字の登場順を求める問題が出題されています。

A問題:室温の条件判断
AtCoder Beginner Contest 174回目、A問題、Air Conditioner、問題文、あなたは室温が30℃以上のとき、またそのときに限り冷房の電源を入れます。今の室温はX℃です。冷房の電源を入れますか?
出力はイエス・ノー形式ですね。30℃以上のときだけイエスなので、Nイコールイントのインプット、プリント、イエス、イフ、N、ダイナリーイコール30、エルス、ノーだけですね。
提出、はい、AC、B問題いきます。B問題、ディスタンス、問題文、2次元平面上にN個の点があります。相込めの点の座標はXI、YIです。これらのうち、原点からの距離がD以下であるような点は何個ありますか?なお、座標PQにある点と原点の距離は√P次乗プラスQ次乗で表されます。
ん?えっと…
N個の点。はあはあ。原点からの距離がDか。ああ、そういうことか。
えっと、コードテスト。NとDイコールマップイントインプットドットスプリット。で、4YインレンジN個。座標が与えられます。
えっと、√ってどうやるんだ?
0.5乗だったっけ?とりあえずPQで入れましょうか。
えっと、4YインレンジN、PQイコールマップのイントのインプットスプリット。
で、PQイコール、えっと、カッコ、Pの次乗プラスQの次乗かけるかける0.5。
で、えー、4分の前、2行目にアンス、アンサー変数を0で定義しておいて、
F、PQ、小なりイコール、Dだったら、アンス2プラスイコール1して、プリントアンサー。
で、どうでしょうか。出力3、入力例1は出力3、入力例2は7が出たらOK。
7、入力例3は6が出たらOK。
6、OKですね。出力、提出していきましょう。
はーい、いったね、OK。ちょっと重かったですが。
C問題:倍数と好きな数字の登場順
ACしたので、C問題いきます。
C問題、レプセプト?リプセプトかな?問題文。
高橋くんはKの倍数と7が好きです。
7、77、777。
7、77、777という数列の中に初めてKの倍数が登場するのは何項目ですか?
存在しない場合は代わりに-1を出力してください。
10の6乗Kがあります。1以上10の6乗以下。
入力例1、101、7、77、777は101の倍数ではありませんが、7777は101の倍数です。
10の6乗回法文繰り返しちゃダメなのかな、これ。
入力例2、出力例-1。数列の値はすべて奇数なので、2の倍数が登場することはありません。
奇数なので、奇数なので、っていうことはだ。
えーと、Kイコールイントのインプット。
で、アンサー、アンサーじゃないな。
えーと、Kの倍数が登場するのは何項目?
何項目ですか?だから、if K%2イコールイコールゼロだったら、exit print-1。
で、じゃなかった場合、
んーと、
for in range 10の6乗
プラス1?
プラス10?
とかにしとく?
えー、何項目かだもんね。
だから、print iプラス1が正解。
if、あー、どうしようかな。
7変数、7変数をまず7というのを用意しておいて、
あ、いや、何にもなしでいいか、まずは。
で、7プラスイコール文字列7。
で、7プラスイコール文字列7。
if int 7が%Kイコールイコールゼロだったら、exit print iプラス1。
で、最後まで4分終わったら、print-1。
で、最後まで4分終わったら、print-1。
で、最後まで4分終わったら、print-1。
で、最後まで4分終わったら、print-1。
101は4?
101は4だね。
2はマイナス1が出ます。
999983は、999982が出る。
あ、エラー。
int 7 exceeds the limit for integer string conversion.
int 7 exceeds the limit for integer string conversion.
value has 43dx.
4301ディジット。文字列プラスしすぎだよってことかな。
うーん、では解説見てみましょうか。
CCC。
与えられた数列のi項目目は7×1×10×10の次乗プラス…10のi-1乗。
つまり、9分の7×10のi乗-1と書ける等比数列の和のため、求めるべきものは7×10のi乗-1が9kで割り切れるような最小の正の整数iです。
kが7の倍数である場合は、代わりに10のi乗-1が7分の9kで割り切れるかを考えても同じことで、
そうでない場合は、
代わりに10のi乗-1が9kで割り切れるかを考えても同じことです。
したがって整数lを、kが7の倍数であればlイコール7分の9k、そうでなければlイコール9kと定義し、
10のi乗-1がlで割り切れるような最小のi、すなわち10のi乗をlで割った余りが1であるような最小の正の整数iを求めれば良いことになります。
lが2の倍数であるなら、
lが2の倍数であるなら、
この正の整数iに対しても、10のi乗は2の倍数であるため、lで割った余りが1となることはありません。
lが5の倍数である場合も同様です。
このいずれにも該当しない場合、すなわち10とlが互いに素である場合、
オイラーの定理より、
わぁ初めて見たこれ。
10の何乗これ。
イコール、イコールじゃないな、合同1、戻L。
が成立します。
すなわち、iイコール1、2、3、4と順に検討していけば、
遅くともiイコールL、小なりイコール90万までには求めるべき整数が見つかる。
例えば、iイコール10の100乗でようやく見つかるといったことはないということが保証されているため、
実際に10の1乗、10の次乗を実際にLで割った余りを計算していけば、
十分早く解を求められます。
ただし、10の99万9982乗などといった巨大な値を直接Lで割ろうとするべきではありません。
その代わりに、10のi乗をLで割った余りを10倍してLで割れば、
10のi乗プラス1をLで割った余りがまとまります。
なお、以上の数学的考察をせずとも、
答えがマイナス1でないならどうせある程度小さいだろう、
でなければこの枠には難しすぎると予想してしまい、
7、77、777をKで割った余りを上の段階で段落で述べたような方針で計算していくことで、
答えを求めることも可能ではあります。
ちんぷんかんぷんですね。
では、他のユーザーのコード例を見て勉強しておきます。
また次回。お疲れ様です。
ご視聴ありがとうございました。
12:28

コメント

スクロール