結果
問題 | No.5009 Draw A Convex Polygon |
ユーザー |
👑 ![]() |
提出日時 | 2022-12-03 01:11:02 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 845 ms / 2,600 ms |
コード長 | 1,537 bytes |
コンパイル時間 | 620 ms |
実行使用メモリ | 38,132 KB |
スコア | 1,000,000 |
平均クエリ数 | 1000001.00 |
最終ジャッジ日時 | 2022-12-03 01:11:05 |
合計ジャッジ時間 | 3,213 ms |
ジャッジサーバーID (参考情報) |
judge13 / judge16 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 1 |
ソースコード
#include <cstdio>#include <vector>#include <algorithm>#include <cassert>using namespace std;using i64 = long long;// please ensure x != 0int LsbIndex(unsigned int x) noexcept {return __builtin_ctz(x);}unsigned int GCD(unsigned int a, unsigned int b) noexcept {if(!a || !b) return a|b;int q = LsbIndex(a|b);b >>= LsbIndex(b);a >>= LsbIndex(a);while(a!=b){if(a<b){ b-=a; b>>=LsbIndex(b); }else{ a-=b; a>>=LsbIndex(a); }}return a<<q;};struct Frac{i64 a, b;};bool operator<(Frac l, Frac r){ return l.a * r.b < l.b * r.a; }int main(){vector<Frac> Fracs;Fracs.push_back({ 0, 1 });for(int d=1; Fracs.size() < 250000; d++) for(int j=1; j<d && Fracs.size() < 250000; j++) if(GCD(d,j) == 1) Fracs.push_back({ d-j, j });sort(Fracs.begin(), Fracs.end());vector<std::pair<i64, i64>> points;points.push_back({ 102459, -75574918 });for(auto f : Fracs){ auto [x,y] = points.back(); points.push_back({ x+f.b, y+f.a }); }for(auto f : Fracs){ auto [x,y] = points.back(); points.push_back({ x-f.a, y+f.b }); }for(auto f : Fracs){ auto [x,y] = points.back(); points.push_back({ x-f.b, y-f.a }); }for(auto f : Fracs){ auto [x,y] = points.back(); points.push_back({ x+f.a, y-f.b }); }points.pop_back();printf("%d\n", (int)points.size());for(auto [x,y] : points){printf("%lld %lld\n", x, y);assert(-75574918 <= x && x <= 75574917);assert(-75574918 <= y && y <= 75574917);}return 0;}