整数の入門にいい感じの問題!
問題概要
正の整数 と非負整数
が与えられる。次の条件を満たす正の整数
の個数を求めよ。
を
で割った余りが
である
制約
解法
を
で割ったときの商を
とおくと、
と表せる。これを式変形すると
となる。この式は、 が
の約数であることを表している。ただし、
が
で割ったときの余りであることから、
であることも必要となる。
以上をまとめると、次のことが条件となる。
は
の約数である
である
逆にこれらを満たすならば、 を
で割ったあまりは
となる。
コード
結局、 の約数を列挙して、
より大きいものの個数を数える問題へと帰着された。
計算量は となる。
#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; }