AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC238-D AND and SUM
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("2");
WillReturn.Add("1 8");
WillReturn.Add("4 2");
//Yes
//No
}
else if (InputPattern == "Input2") {
WillReturn.Add("4");
WillReturn.Add("201408139683277485 381410962404666524");
WillReturn.Add("360288799186493714 788806911317182736");
WillReturn.Add("18999951915747344 451273909320288229");
WillReturn.Add("962424162689761932 1097438793187620758");
//No
//Yes
//Yes
//No
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
struct ASInfoDef
{
internal long A;
internal long S;
}
static void Main()
{
List<string> InputList = GetInputList();
long[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => long.Parse(pX)).ToArray();
var ASInfoList = new List<ASInfoDef>();
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
ASInfoDef WillAdd;
WillAdd.A = wkArr[0];
WillAdd.S = wkArr[1];
ASInfoList.Add(WillAdd);
}
var sb = new System.Text.StringBuilder();
foreach (ASInfoDef EachASInfo in ASInfoList) {
long SumDiff = EachASInfo.S - EachASInfo.A * 2;
if (SumDiff >= 0 && (SumDiff & EachASInfo.A) == 0) {
sb.AppendLine("Yes");
}
else {
sb.AppendLine("No");
}
}
Console.Write(sb.ToString());
}
}
解説
X AND Y = a
X + Y = s
で考察します。
X AND Y = a
で、XとYのビットは限定されます。
具体的には
aのビット表現で1の箇所は、XもYも1で確定
aのビット表現で0の箇所は、
XとYの両方0か、片方のみが1
となります。
余った数は、s-2*a ですので、
これを未確定ビットで表現できるかを調べてます。