#include using namespace std; //#include //using namespace atcoder; #define ll long long #define GET_REP(_1, _2, _3, _4,NAME, ...) NAME #define rep1(i, n) for (int i = 0; i < (n); ++i) #define rep2(i, m, n) for (int i = (n); i < (m); ++i) #define rep3(i, m, n, o) for (int i = (n); i < (m); i+=o) #define rep(...) GET_REP(__VA_ARGS__, rep3, rep2, rep1)(__VA_ARGS__) #define rrep1(i,n) for (int i = (n); i > 0; i--) #define nall(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define fi first #define se second #define getvec(a,n,s) \ vector a(n);\ for (auto& i:a) cin >>i; #define int long long #define vi vector #define vpii vector> #define vs vector #define vvi vector> #define vvs vector> template auto vec(size_t n, T val) { return std::vector(n, val); } template auto vec(size_t n, Sizes... sizes) { return std::vector(n, vec(sizes...)); } random_device rd; mt19937 gen(rd()); uniform_int_distribution dist(1999, 300000); constexpr long long INF = (1LL << 60); // 辺の情報 struct Edge { // 行先 int to; // コスト int cost; }; using Graph = std::vector>; // { distance, from } using Pair = std::pair; // ダイクストラ法 (1.1 基本実装) // distances は頂点数と同じサイズ, 全要素 INF で初期化しておく void Dijkstra(const Graph& graph, std::vector& distances, int startIndex) { // 「現時点での最短距離, 頂点」の順に取り出す priority_queue // デフォルトの priority_queue は降順に取り出すため std::greater を使う std::priority_queue, std::greater> q; q.emplace((distances[startIndex] = 0), startIndex); while (!q.empty()) { const long long distance = q.top().first; const int from = q.top().second; q.pop(); // 最短距離でなければ処理しない if (distances[from] < distance) { continue; } // 現在の頂点からの各辺について for (const auto& edge : graph[from]) { // to までの新しい距離 const long long d = (distances[from] + edge.cost); // d が現在の記録より小さければ更新 if (d < distances[edge.to]) { q.emplace((distances[edge.to] = d), edge.to); } } } } signed main() { int n; cin >> n; rep(i, n - 1) { rep(j, n) { cout << dist(gen) << " "; } cout << endl; } rep(i, n) { rep(j, n - 1) { cout << dist(gen) << " "; } cout << endl; } }