結果

問題 No.1200 お菓子配り-3
ユーザー yudedako
提出日時 2020-09-07 00:36:03
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 137 ms / 4,000 ms
コード長 2,117 bytes
コンパイル時間 1,314 ms
コンパイル使用メモリ 122,872 KB
最終ジャッジ日時 2025-01-14 08:05:17
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 31
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm>
#include <set>
#include <iomanip>
#include <numeric>
#include <queue>
#include <string>
#include <map>
#include <fstream>
#include <cassert>
#include <stack>
#include <climits>
std::vector<int> primes(const int upper) {
std::vector<bool> is_prime(upper + 1, true);
for (auto i = 2; i * i <= upper; ++i) {
if (is_prime[i]) {
for (auto j = i * i; j <= upper; j += i) {
is_prime[j] = false;
}
}
}
std::vector<int> result;
for (auto i = 2; i <= upper; ++i) {
if (is_prime[i]) result.push_back(i);
}
return result;
}
std::vector<int> cal_factors(int x, const std::vector<int>& prime) {
std::map<int, int> prime_factors;
int size{ 1 };
for (const auto p : prime) {
if (p * p > x) break;
if (x % p == 0) {
int count{ 0 };
while (x % p == 0) {
x /= p;
++count;
}
prime_factors[p] = count;;
size *= count + 1;
}
}
if (x > 1) {
prime_factors[x] = 1;
size <<= 1;
}
std::vector<int> factors{ 1 }; factors.reserve(size);
for (const auto &pair: prime_factors) {
for (int i = factors.size() - 1; i >= 0; --i) {
factors.push_back(factors[i] * pair.first);
for (auto j = 1; j < pair.second; ++j) {
factors.push_back(factors.back() * pair.first);
}
}
}
return factors;
}
int main() {
std::cin.tie(nullptr); std::cin.sync_with_stdio(false);
const auto prime = primes(100000);
int s; std::cin >> s;
for (; s > 0; --s) {
int x, y; std::cin >> x >> y;
if (x == y) {
std::cout << cal_factors(x, prime).size() - 1 + (x - 1) + ((x & 1) == 0 ? -1 : 0) << '\n';
continue;
}
if (x < y) std::swap(x, y);
const auto sum = x + y;
const auto diff = x - y;
const auto add = cal_factors(sum, prime);
const auto sub = cal_factors(diff, prime);
std::set<int> sub_set;
std::copy(sub.begin(), sub.end(), std::inserter(sub_set, sub_set.begin()));
std::cout << std::count_if(add.begin(), add.end(), [&sub_set, sum, diff](const int f) {return sub_set.find(f - 2) != sub_set.end() && sum / f
            > diff / (f - 2) && (sum / f & 1) == (diff / (f - 2) & 1); }) << '\n';
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0