<Atcoder Grand 036 - A> 叉積
https://atcoder.jp/contests/agc036/tasks/agc036_a
題意:
已知面積S,在第一象限內構造3個座標,使得三點連線圍成的三角形面積爲S/2,打印座標。
思路:
S = ad - bc,先將一點定在原點(0,0),另外兩點座標是(a, b)和(c,d)。ad必然不小於S,初始化a = d = sqrt(S),不斷放大a和d當ad>=S時停止。然後就在ad - S內找因子構造出bc即可。
AC代碼:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxx = 1e5 + 7; const int Inf = 1 << 30; const ll INF = 1ll << 60; ll s; int a, b, c, d; int main() { scanf("%lld", &s); // 定一頂點在(0, 0), 構造向量(a, b)和(c, d) // 叉積求面積: s = ad - bc a = d = (int)sqrt(s); while(s > 1ll * a * d) { if(a < d) a++; else d++; } ll chk = 1ll * a * d - s; for(int i = 1; i <= sqrt(chk); i++) { if(!(chk % i)) { if(i <= 1e9 && chk / i <= 1e9) { b = i; c = chk / i; break; } } } printf("0 0 %d %d %d %d\n", a, b, c, d); return 0; }