AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC107-B Quadruple
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 1");
//4
}
else if (InputPattern == "Input2") {
WillReturn.Add("2525 -425");
//10314607400
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static long mN;
static long mK;
static void Main()
{
List<string> InputList = GetInputList();
long[] wkArr = InputList[0].Split(' ').Select(pX => long.Parse(pX)).ToArray();
mN = wkArr[0];
mK = wkArr[1];
// a+bでループする
long Answer = 0;
for (long LoopSum = 2; LoopSum <= 2 * mN; LoopSum++) {
long Pattern1 = DerivePatternCnt(LoopSum);
// c+dの場合の数
long Pattern2 = DerivePatternCnt(LoopSum - mK);
// 積の法則
Answer += Pattern1 * Pattern2;
//Console.WriteLine("a+b={0}の場合は左辺が{1}通り、右辺が{2}通り", LoopSum, Pattern1, Pattern2);
}
Console.WriteLine(Answer);
}
// 和がSになる2つの正整数の場合の数を返す
static long DerivePatternCnt(long pSum)
{
if (pSum < 2 || 2 * mN < pSum) return 0;
long SumMid = mN + 1;
long SumDiff = Math.Abs(SumMid - pSum);
return mN - SumDiff;
}
}
解説
a + b - c - d = K
なので、cとdは移項します。
a + b = K + c + d
a + b を固定すれば、
2つの数の和を引数として、作る方法の場合の数を返す関数を
作って、
(a + b) と (a + b - K)で呼んで
場合の数の積の法則を使えば、
a + b ごとでの場合の数が分かるので、
a + b の値でループさせてます。