見出し画像

AtCoder Beginner Contest 174を見直す C - Repsept

AtCoder初めて5ヶ月目になってやっと、「AtCoder Problems」で問題の難易度がみられることがわかりました。今回はC問題が「緑」で、D問題が「茶色」だった様ですね。通りでC問題難しいわけだ。

問題

整数k(1<=k<=10^6)が与えられるので、
7, 77, 777, 7777, 77777, .....と言う数列の中に初めてkの倍数が登場するのは何項目か?kの倍数が登場しない場合は-1を出力せよ。

結構時間かけたんですが、サンプルが通せなかったので諦めました。

解説をみて作成した解答(CPP)

#include <bits/stdc++.h>
using namespace std;

int main() {
   int k;
   cin >> k;
   int x = 7%k;
   set<int> s;
   int i = 1;
   if (k%2 == 0 || k%5 == 0 ) {
       cout << -1 << endl;
       return 0;
   }
   while (s.count(x) == 0) {
       if(x == 0) {
           cout << i << endl;
           return 0;
       }
       s.insert(x);
       x = (x*10+7)%k;
       i++;
   }
   cout << -1 << endl;
   return 0;
}

理解のための解説

画像1

7, 77, 777, 7777....の数列は、前の項を10倍して7を足した数の連続になっている(上図左上)
77 = 7*10+7, 777 = 77*10+7みたいな感じで。
数列をkで割った余り(mod)も同様に、前の項を10倍して7を足した数をkで割った余りの連続になる(上図左下)
また、kの倍数が存在しない場合は、上図の様にModの数列がループ(同じ数字が登場する)事になる(上図右)

よって、記載した解答の様になる。

この記事が気に入ったらサポートをしてみませんか?