トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
ABC-060-B Choose Integers
■■■問題■■■
あなたは、正の整数をいくつか選び、それらの総和を求めます。
選ぶ数の上限や、選ぶ整数の個数に制限はありません。
どんなに大きな整数を選んでもよいですし、整数を5000兆個選んでもよいです。
ただし、選ぶ数はすべてAの倍数でなくてはいけません。
また、少なくとも1つは整数を選ばなくてはいけません。
そして総和をBで割ったあまりがCとなるようにしたいです。
こうなるように整数を選ぶことが出来るか判定してください。
出来るならばYES、そうでないならばNOを出力してください。
■■■入力■■■
A B C
●1 <= A <= 100
●1 <= B <= 100
●0 <= C < B
■■■出力■■■
YESかNOを出力する。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("7 5 1");
//YES
//たとえば7,14を選ぶと総和は21となり、
//これを5で割ったあまりは1となります。
}
else if (InputPattern == "Input2") {
WillReturn.Add("2 2 1");
//NO
//偶数をいくつ足したとしても、けっして奇数になることはありません
}
else if (InputPattern == "Input3") {
WillReturn.Add("1 100 97");
//YES
//1の倍数、つまりすべての整数が選べるので、97を選べば良いです
}
else if (InputPattern == "Input4") {
WillReturn.Add("40 98 58");
//YES
}
else if (InputPattern == "Input5") {
WillReturn.Add("77 42 36");
//NO
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = InputList[0].Split(' ').Select(X => int.Parse(X)).ToArray();
int A = wkArr[0];
int B = wkArr[1];
int C = wkArr[2];
var ModSet = new HashSet<int>();
int CurrMod = A;
CurrMod %= B;
while (true) {
if (ModSet.Add(CurrMod) == false)
break;
CurrMod += A;
CurrMod %= B;
}
Console.WriteLine(ModSet.Contains(C) ? "YES" : "NO");
}
}
解説
等差数列
A 2*A 3*A 4*A 5*A ・・・
の各項を、Bを法とした余りとした、循環数列を作成してます。