たこすの競プロライブラリメモ

C++の個人的競プロライブラリです。99%拝借。

約数列挙 (divisor)

目的

約数をvectorに保存する。

制約

 O(\sqrt{N})

コード

vector<long long> divisor(long long n)
{
    vector<long long> ret;
    for (long long i = 1; i * i <= n; i++)
    {
        if (n % i == 0)
        {
            ret.push_back(i);
            if (i * i != n)
                ret.push_back(n / i);
        }
    }
    sort(begin(ret), end(ret));
    return (ret);
}

コードテスト

#include <bits/stdc++.h>
using namespace std;

vector<long long> vec;

vector<long long> divisor(long long n)
{
    vector<long long> ret;
    for (long long i = 1; i * i <= n; i++)
    {
        if (n % i == 0)
        {
            ret.push_back(i);
            if (i * i != n)
                ret.push_back(n / i);
        }
    }
    sort(begin(ret), end(ret));
    return (ret);
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    long long N;
    string S;
    cin >> N;

    vec = divisor(N);

    for (long long i = 0; i < vec.size(); i++){
        cout << vec.at(i) << endl;
    }
}
30
1
2
3
5
6
10
15
30

出典

ei1333.github.io