- ๋ฌธ์
ํธ๋ญ์ ํ๊ณ ์ด๋ํ๋ ์๊ทผ์ด๋ ๊ฒฝ์ฐฐ์ ๊ฒ๋ฌธ์ ๋ฐ๊ฒ ๋์๋ค. ๊ฒฝ์ฐฐ์ ์๊ทผ์ด๊ฐ ์ด๋ฐํ๋ ํ๋ฌผ์ ํ๋ํ๋ ๋ชจ๋ ํ์ธํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ๊ฒ๋ฌธํ๋๋ฐ ์์ฒญ๋๊ฒ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
์๊ทผ์ด๋ ์๊ฐ์ ๋์ฐ๊ธฐ ์ํด์ ์ํ ๊ฒ์์ ํ๊ธฐ๋ก ํ๋ค.
๋จผ์ ๊ทผ์ฒ์ ๋ณด์ด๋ ์ซ์ N๊ฐ๋ฅผ ์ข ์ด์ ์ ๋๋ค. ๊ทธ ๋ค์, ์ข ์ด์ ์ ์ ์๋ฅผ M์ผ๋ก ๋๋์์ ๋, ๋๋จธ์ง๊ฐ ๋ชจ๋ ๊ฐ๊ฒ ๋๋ M์ ๋ชจ๋ ์ฐพ์ผ๋ ค๊ณ ํ๋ค. M์ 1๋ณด๋ค ์ปค์ผ ํ๋ค.
N๊ฐ์ ์๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ๋ฅํ M์ ๋ชจ๋ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
- ์ฝ๋
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
//์ต๋ ๊ณต์ฝ์ ๊ตฌํ๋ ํจ์
int gcdIter(int a, int b) {
while (b) {
a %= b;
swap(a, b);
}
return a;
}
set<int> cal(vector<int>& v, int n) {
int num; // ์ต๋๊ณต์ฝ์ ๊ตฌํ ๊ธฐ์ค ์
set<int> s; //๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ ์
//์ด์ํ ์๋ค๊ฐ์ ์ฐจ๋ผ๋ฆฌ ์ต๋๊ณต์ฝ์ ๊ตฌํ๊ธฐ
num = v[1] - v[0];
for (int i = 2; i < n; i++) {
num = gcdIter(num, v[i] - v[i - 1]);
}
//์ต๋๊ณต์ฝ์์ ์ฝ์ ๊ตฌํ๊ธฐ
for (int i = 2; i*i <= num; i++) { //์๊ฐ ์ด๊ณผ ํด๊ฒฐ
if (num % i == 0) {
s.insert(i);
s.insert(num/i);
}
}
s.insert(num); //์ต๋ ๊ณต์ฝ์๊น์ง ๋ฃ๊ธฐ
return s;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m;
set<int> result; //๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ์
//์
๋ ฅ
cin >> n;
vector<int> v;
for (int i = 0; i < n; i++) {
cin >> m;
v.push_back(m);
}
//์ฐ์ฐ
//์ฐจ๋ฅผ ์ฝ๊ฒ ๊ตฌํ๊ธฐ ์ํด ์ ๋ ฌ
sort(v.begin(), v.end());
result = cal(v, n);
//์ถ๋ ฅ
for (auto iter : result) {
cout << iter << " ";
}
return 0;
}
- ํด์ค
1. gcdIter ํจ์
- ์ต๋ ๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ํจ์
2. cal ํจ์
- ๋๋จธ์ง๊ฐ ๋ชจ๋ ๊ฐ๊ฒ๋๋ m ๊ณ์ฐํ๋ ํจ์
: ์ด์ํ ์๋ค๊ฐ์ ์ฐจ๋ผ๋ฆฌ ์ต๋๊ณต์ฝ์๋ฅผ ๊ตฌํ ํ ์ต๋๊ณต์ฝ์์ ์ฝ์๋ฅผ ๊ตฌํ๋ฉด m์ ๊ตฌํ ์ ์์
: gcdIterํจ์๋ฅผ ํตํด ๊ณ์ํด์ ์ด์ํ ์๋ค๊ฐ์ ์ฐจ๋ผ๋ฆฌ ์ต๋๊ณต์ฝ์๋ฅผ ๊ตฌํจ
: ์ต๋๊ณต์ฝ์์ ์ฝ์๋ฅผ ๊ตฌํ ๋ i์ num/i๋ฅผ ํ ๋ฒ์ insertํ์ฌ i*i <=num๊น์ง๋ง ์ฐ์ฐ์ ํ๋๋ก ํจ
: ๋ง์ง๋ง ๋ณธ์ธ๊น์ง ์ต๋๊ณต์ฝ์์ ๋ฃ์ ํ set๋ฅผ ๋ฐํ
3. main ํจ์
: ๋ชจ๋ ์ ๋ ฅ ๋ฐ์ ๋ฒกํฐ์ ์ ์ฅํ ํ, ๊ณ์ฐํ๊ธฐ ์ฝ๊ฒ ์ ๋ ฌํ ๋ค calํจ์๋ฅผ ํตํด ์ฐ์ฐ