はじめに
AtCoder Beginner Contest 290の復習記事です。
記事におけるScanner
クラスは、自作の入力クラスです。
コンテスト
https://atcoder.jp/contests/abc290
問題A
A[B[i]]
の合計値が答えとなります。
public static void Solve()
{
var (N, M) = Scanner.Scan<int, int>();
var A = Scanner.ScanEnumerable<int>().ToArray();
var B = Scanner.ScanEnumerable<int>().ToArray();
var answer = B.Sum(x => A[x - 1]);
Console.WriteLine(answer);
}
問題B
o
の数がK
の場合かつS[i]
がo
の場合はT[i]
はo
となり、それ以外の場合はT[i]
はx
になります。
public static void Solve()
{
var (N, K) = Scanner.Scan<int, int>();
var S = Scanner.Scan<string>();
var buffer = new char[N];
var k = 0;
for (var i = 0; i < N; i++)
{
if (k < K && S[i] == 'o')
{
buffer[i] = 'o';
k++;
}
else
{
buffer[i] = 'x';
}
}
var answer = new string(buffer);
Console.WriteLine(answer);
}
問題C
A
の重複を取り除き昇順にソートした初めのK
個以内のものをC
としたとき、0
から順に数えて初めてC
に出現しなかった数が答えとなります。
public static void Solve()
{
var (N, K) = Scanner.Scan<int, int>();
var A = Scanner.ScanEnumerable<int>().ToArray();
var mex = 0;
foreach(var x in A.OrderBy(x => x).Distinct().Take(K))
{
if(x == mex) mex++;
else break;
}
Console.WriteLine(mex);
}
問題D
マスが無限に続き、手順i-iiiをt
回操作したのときのx
をf(t)
としたとき、f(t)==D*(t-1)
になります。
また、マスがN
個で始点を0
としたときに、手順i-iiiを繰り返して再び始点0
に戻ってくる、つまりf(t)%N==0
となるには、Lcm(a,b)
をa
とb
の最小公倍数としたとき、f(t)==Lcm(N,D)
になる必要があります。
そして、手順iiにより始点に再び戻ってきたときに始点を+1
することから、K
回操作したときの始点の変更回数は、f(K)/Lcm(N,D)
回であることがわかります。
このことから、K
回目のx
の位置は(f(K) + f(K)/Lcm(N,D)) % N
となります。
public static void Solve()
{
var T = Scanner.Scan<int>();
while (T-- > 0)
{
var (N, D, K) = Scanner.Scan<long, long, long>();
var x = D * (K - 1);
var answer = (x + x / Lcm(N, D)) % N;
Console.WriteLine(answer);
}
}
public static long Lcm(long a, long b) => a / Gcd(a, b) * b;
public static long Gcd(long a, long b) => b == 0 ? a : Gcd(b, a % b);