1. 程式人生 > 其它 >AtCoder題解 —— AtCoder Grand Contest 050 —— A - AtCoder Jumper ——數論

AtCoder題解 —— AtCoder Grand Contest 050 —— A - AtCoder Jumper ——數論

技術標籤:OJ題解# AtCoder題解AtCoder題解AGC050A題AtCoder Jumper

題目相關

題目連結

AtCoder Grand Contest 050 A 題,https://atcoder.jp/contests/agc050/tasks/agc050_a

Problem Statement

Have you noticed this part of AtCoder website?
在這裡插入圖片描述Here the numbers are carefully chosen so that we can jump from any page to any page in small number of steps, while each page doesn’t contain too many links. In this task you are asked to do a similar thing with only two links on each page!

Snuke made a website with N pages numbered 1 through N. For each i (1≤i≤N), choose two integers a i a_i ai and b i b_i bi ( 1 ≤ a i , b i ≤ N 1≤a_i,b_i≤N 1ai,biN), and add two links on Page i: a link to Page a i a_i ai and a link to Page b i b_i bi. The website must satisfy the following constraint:

  • You must be able to jump from any page to any other page by clicking at most 10 links.

Under the constraints of the problem, we can prove that this is always possible.

Input

Input is given from Standard Input in the following format:

N

Output

Print the answer in the following format:

a1 b1
.
.
an bn

In case there are multiple possible answers, print any.

Sample 1

Sample Input 1

1

Sample Output 1

1 1

Explaination

Snuke made an excellent website with only one page. It even contains two links to itself!

Sample 2

Sample Input 2

3

Sample Output 1

2 3
1 3
1 2

Explaination

Here we can jump from any page to any other page by a direct link.

Constraints

  • 1 ≤ N ≤ 1000 1 \leq N \leq 1000 1N1000

題解報告

題目翻譯

給一個 N,表示某網站有 N 頁。設計一個網頁連結方案,要求任意兩頁之間調整次數不能超過 10 次。

題目分析

一個簡單的數學題。假設當前網頁頁碼為 x x x,我們只需要將 ( 2 ∗ x ) m o d    N (2*x) \mod N (2x)modN ( 2 ∗ x + 1 ) m o d    N (2*x+1) \mod N (2x+1)modN 之間建立連結。這樣,從 x x x 出發,在 10 步以內,我們可以到達 1024 x , 1024 x + 1 , ⋯   , 1024 x + 1023 1024x, 1024x+1, \cdots, 1024x+1023 1024x,1024x+1,,1024x+1023。由於本題的資料範圍 N ≤ 1000 N \leq 1000 N1000,自然我們可以保證任意兩個網頁在 10 步之內到達。
當然本題還有其他做法。比如我們可以考慮每 10 10 10 個頁面一組,然後再將不同組的第一個網頁雙向連結起來。但是上面的方法是最簡單的。

樣例資料分析

樣例資料 1

根據輸入,N=1。這樣我們只需要將 1 和 1 建立連結,問題就解決了。

樣例資料 2

根據輸入,N=3。
i = 1 i=1 i=1 的時候,我們將 3 和 1 建立連結。
i = 2 i=2 i=2 的時候,我們將 2 和 3 建立連結。
i = 3 i=3 i=3 的時候,我們將 1 和 2 建立連結。
問題解決。

資料規模分析

N 最大值為 1000,非常小。用 int 沒問題。

AC 參考程式碼

//https://atcoder.jp/contests/agc050/tasks/agc050_a
//A - AtCoder Jumper
#include <bits/stdc++.h>

using namespace std;

//如果提交到OJ,不要定義 __LOCAL
//#define __LOCAL

int main() {
#ifndef __LOCAL
    //這部分程式碼需要提交到OJ,本地除錯不使用
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
#endif
    int n;
    cin>>n;
    //
    for (int i=1; i<=n; i++) {
        cout<<(2*i)%n+1<<" "<<(2*i+1)%n+1<<"\n";
    }

#ifdef __LOCAL
    //這部分程式碼不需要提交到OJ,本地除錯使用
    system("pause");
#endif
    return 0;
}

在這裡插入圖片描述

時間複雜度

O(N)。

空間複雜度

O(1)。