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!
- 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 1≤N≤1000
題解報告
題目翻譯
給一個 N,表示某網站有 N 頁。設計一個網頁連結方案,要求任意兩頁之間調整次數不能超過 10 次。
題目分析
一個簡單的數學題。假設當前網頁頁碼為
x
x
x,我們只需要將
(
2
∗
x
)
m
o
d
N
(2*x) \mod N
(2∗x)modN 和
(
2
∗
x
+
1
)
m
o
d
N
(2*x+1) \mod N
(2∗x+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
N≤1000,自然我們可以保證任意兩個網頁在 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)。