:heavy_check_mark: test/Math/enumerate_divisor/aoj-ITP1_3_D.test.cpp

Depends on

Code

// competitive-verifier: PROBLEM https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_3_D

#include "Math/enumerate_divisor.hpp"
#include <bits/stdc++.h>

using namespace std;

int main()
{
    long long a, b, c;
    cin >> a >> b >> c;

    vector<long long> divisor = enumerate_divisor(c);

    long long ans = 0;

    for (long long n : divisor)
    {
        if (a <= n && n <= b)
            ans++;
    }

    cout << ans << endl;

    return 0;
}
#line 1 "test/Math/enumerate_divisor/aoj-ITP1_3_D.test.cpp"
// competitive-verifier: PROBLEM https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_3_D

#line 1 "Math/enumerate_divisor.hpp"
#include <bits/stdc++.h>
using namespace std;

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

vector<long long> enumerate_divisor(const vector<pair<long long, long long>> &prime_factors)
{
    assert(all_of(prime_factors.begin(), prime_factors.end(), [](const auto &n)
                  { return 0 < n.first && 0 < n.second; }));

    vector<long long> dst;
    auto dfs = [&](int now, long long n, auto dfs) -> void
    {
        if (now == prime_factors.size())
        {
            dst.push_back(n);
            return;
        }

        auto [p, c] = prime_factors[now];
        for (int i = 0; i < c + 1; i++)
        {
            dfs(now + 1, n, dfs);
            if (i != c)
            {
                n *= p;
            }
        }
    };

    dfs(0, 1, dfs);

    sort(dst.begin(), dst.end());

    return dst;
}
#line 5 "test/Math/enumerate_divisor/aoj-ITP1_3_D.test.cpp"

using namespace std;

int main()
{
    long long a, b, c;
    cin >> a >> b >> c;

    vector<long long> divisor = enumerate_divisor(c);

    long long ans = 0;

    for (long long n : divisor)
    {
        if (a <= n && n <= b)
            ans++;
    }

    cout << ans << endl;

    return 0;
}

Test cases

Env Name Status Elapsed Memory
g++ 00_sample_00.in :heavy_check_mark: AC 5 ms 3 MB
g++ 01_corner_00.in :heavy_check_mark: AC 4 ms 3 MB
g++ 01_corner_01.in :heavy_check_mark: AC 4 ms 3 MB
g++ 01_corner_02.in :heavy_check_mark: AC 4 ms 3 MB
g++ 01_corner_03.in :heavy_check_mark: AC 4 ms 3 MB
g++ 01_corner_04.in :heavy_check_mark: AC 4 ms 3 MB
g++ 01_corner_05.in :heavy_check_mark: AC 4 ms 3 MB
g++ 01_corner_06.in :heavy_check_mark: AC 4 ms 3 MB
g++ 02_rand_00.in :heavy_check_mark: AC 4 ms 3 MB
g++ 02_rand_01.in :heavy_check_mark: AC 4 ms 3 MB
g++ 02_rand_02.in :heavy_check_mark: AC 4 ms 3 MB
g++ 02_rand_03.in :heavy_check_mark: AC 4 ms 3 MB
g++ 02_rand_04.in :heavy_check_mark: AC 4 ms 3 MB
g++ 02_rand_05.in :heavy_check_mark: AC 4 ms 3 MB
g++ 02_rand_06.in :heavy_check_mark: AC 4 ms 3 MB
g++ 02_rand_07.in :heavy_check_mark: AC 4 ms 3 MB
g++ 03_maximum_00.in :heavy_check_mark: AC 4 ms 3 MB
g++ 03_maximum_01.in :heavy_check_mark: AC 4 ms 3 MB
g++ 03_maximum_02.in :heavy_check_mark: AC 4 ms 3 MB
g++ 03_maximum_03.in :heavy_check_mark: AC 4 ms 3 MB
Back to top page