Atcoder Grand 036 - A 叉積

<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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章