整数の入門にいい感じの問題!
問題概要
正の整数 と非負整数 が与えられる。次の条件を満たす正の整数 の個数を求めよ。
- を で割った余りが である
制約
解法
を で割ったときの商を とおくと、
と表せる。これを式変形すると
となる。この式は、 が の約数であることを表している。ただし、 が で割ったときの余りであることから、 であることも必要となる。
以上をまとめると、次のことが条件となる。
- は の約数である
- である
逆にこれらを満たすならば、 を で割ったあまりは となる。
コード
結局、 の約数を列挙して、 より大きいものの個数を数える問題へと帰着された。
計算量は となる。
#include <bits/stdc++.h> using namespace std; // n の約数を列挙 vector<long long> calc_divisor(long long n) { vector<long long> res; for (long long i = 1LL; i*i <= n; ++i) { if (n % i == 0) { res.push_back(i); long long j = n / i; if (j != i) res.push_back(j); } } sort(res.begin(), res.end()); return res; } int main() { long long N, K; cin >> N >> K; // N - K の約数のうち K より大きいものを数える const auto &div = calc_divisor(N - K); long long res = 0; for (auto v : div) if (v > K) ++res; cout << res << endl; }