AtCoderのAGC
次のAGCの問題へ
前のAGCの問題へ
AGC036-A Triangle
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("3");
//1 0 2 2 0 1
}
else if (InputPattern == "Input2") {
WillReturn.Add("100");
//0 0 10 0 0 10
}
else if (InputPattern == "Input3") {
WillReturn.Add("311114770564041497");
//314159265 358979323 846264338 327950288 419716939 937510582
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
long S = long.Parse(InputList[0]);
long X1 = 1000000000;
long Y2 = S / X1;
if (S % X1 > 0) Y2++;
long X2 = 1;
long Y1 = -S + X1 * Y2;
Console.WriteLine("0 0 {0} {1} {2} {3}", X1, Y1, X2, Y2);
}
}
解説
三角形の面積は、ベクトルの外積を使って求めることが可能です。
3点の内の1点は原点として考えると
三角形の面積は、残りの2点の座標を(X1,Y1) , (X2,Y2) として
X1*Y2 - X2*Y1 の絶対値 / 2 となります。
なので
X1*Y2 - X2*Y1 = S
を満たす X1,Y1,X2,Y2
を求めれば良いと分かります。
後は、
X1 を 10の9乗
X2 を 1
Y2 を (S / X1) の端数切り上げ
として解を求めることができます。