たつのおとしごのしっぽ

技術に楽しくしがみつく えんじにあ の備忘録

AtCoder Beginner Contest 174 「C - Repsept」をC#で解いたら

C問題を解くが目標になっているため、勉強しています。
その過程で作ったAtCoderのC問題のコード、コメント多めで載せてみます。

順位表の解答が早い順で見れば、コードの解答は分かりますが、何をやっているのかいまいちわからないときがあります。
そんな時、コメント沢山ついているコードがあればいいなと思うことがあるため、誰かのためになれば良いなと思います。

「C - Repsept」の問題は、AtCoderさんのリンクからご確認ください。

コード

解いている時は全く分からずでしたが、解説動画を見たら理解できました。
余りで考えるということがポイントで、項数が増えるたびに余りは0からk - 1の中のどれかを順に辿っていきます。

余りが0になるときは、0からk - 1の中をかぶらずに辿っていくうちに余り0にたどり着きます。
余りが0にならないときは、余りの計算をすると0からk - 1の中でどれかが被って処理がループします。

解説動画では、余りの計算をk以上処理したら余りの処理がループしているとのことだったためそこで計算を終了するような処理にしています。


using System;

namespace atcoder174
{
    class Program
    {
        static void Main(string[] args)
        {
            // kの倍数が登場するのは何項目かを解く
            var k = int.Parse(Console.ReadLine()); 
            var remainder = 7 % k;

            // k以上処理しても余りが0にならない場合
            // 余りが0からk - 1の中でループしているため処理を終了する
            for (var i = 1; i < k + 1 ; i++)
            {
                // 余りが0のためiを項数として出力する
                if (remainder == 0)
                {
                    Console.WriteLine(i);
                    return;
                }

                // 項数が増えるたびに数はn * 10 + 7増えるため余りも同じだけ増える
                // それをkで割った余りを再び計算する 
                remainder = (remainder * 10 + 7) % k;

            }

            // 割り切れなかった場合は、-1を出力する
            Console.WriteLine(-1);
        }
    }
}