ural 2032 Conspiracy Theory and Rebranding (数学水题)
ural 2032 Conspiracy Theory and Rebranding
链接:http://acm.timus.ru/problem.aspx?space=1&num=2032
题意:给定一个三角形的三条边 (a, b, c),问是否可放在二维坐标,使得3个顶点都是整数点。若可以,输出任意一组解,否则,输出 -1。
思路:暴力枚举:以 a 为半径做第一象限的 1/4 圆, 以 b 为半径做 一、四 象限的半圆,存储整数点的解,暴力枚举 a 整数点与 b 整数点是否构成长度为 c 的边。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 #include <cstring> 6 7 using namespace std; 8 typedef long long ll; 9 const int N = 1e5+7; 10 ll biao[N]; 11 ll a, b, c; 12 int n; 13 14 ll rr, RR; 15 16 struct P{ 17 ll x, y; 18 P(ll _x=0, ll _y=0) : x(_x), y(_y) {} 19 void out() {printf("%I64d %I64d\n", x, y); } 20 }p[N], v[N]; 21 int ta, tb; 22 23 inline ll sqr(ll x) {return x*x;} 24 25 inline void init(ll av, ll r, int &t, P q[]) { 26 ll aa = av*av; 27 for(ll i = 0, j = av; i <= av; ++i) { 28 while(sqr(i) + sqr(j) > aa) --j; 29 if(sqr(i) + sqr(j) == aa) q[t++] = P(i, j); 30 } 31 } 32 33 inline ll dis(P d1, P d2) { 34 return sqr(d1.x - d2.x) + sqr(d1.y - d2.y); 35 } 36 37 void solve() { 38 ta = tb = 0; 39 ll cc = c*c; 40 init(a, rr, ta, p); 41 init(b, RR, tb, v); 42 bool f = 0, ff; 43 int i, j; 44 P q; 45 for(i = 0; i < ta; ++i) { 46 for(j = 0; j < tb; ++j) { 47 ll d = dis(p[i], v[j]); 48 if(d == cc) { 49 f = 1, ff = 0; 50 break; 51 } else{ 52 q = P(v[j].x, -v[j].y); 53 d = dis(p[i], q); 54 if(d == cc) { 55 f = ff = 1; 56 break; 57 } 58 } 59 } 60 if(f) break; 61 } 62 if(!f) { puts("-1"); return ; } 63 puts("0 0"); p[i].out(); 64 if(!ff) v[j].out(); 65 else q.out(); 66 return ; 67 } 68 69 int main() 70 { 71 #ifdef PIT 72 freopen("i.in", "r", stdin); 73 #endif // PIT 74 75 while(~scanf("%I64d %I64d %I64d", &a, &b, &c)) { 76 rr = a*a, RR = b*b; 77 solve(); 78 } 79 return 0; 80 }