結果

問題 No.1200 お菓子配り-3
ユーザー yudedakoyudedako
提出日時 2020-09-07 00:36:03
言語 C++17
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 124 ms / 4,000 ms
コード長 2,117 bytes
コンパイル時間 1,468 ms
コンパイル使用メモリ 125,476 KB
実行使用メモリ 4,388 KB
最終ジャッジ日時 2023-08-13 06:24:49
合計ジャッジ時間 3,640 ms
ジャッジサーバーID
(参考情報)
judge14 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 3 ms
4,380 KB
testcase_01 AC 2 ms
4,388 KB
testcase_02 AC 3 ms
4,380 KB
testcase_03 AC 2 ms
4,384 KB
testcase_04 AC 2 ms
4,380 KB
testcase_05 AC 2 ms
4,384 KB
testcase_06 AC 2 ms
4,380 KB
testcase_07 AC 3 ms
4,384 KB
testcase_08 AC 3 ms
4,384 KB
testcase_09 AC 3 ms
4,380 KB
testcase_10 AC 3 ms
4,380 KB
testcase_11 AC 3 ms
4,384 KB
testcase_12 AC 8 ms
4,380 KB
testcase_13 AC 8 ms
4,380 KB
testcase_14 AC 8 ms
4,380 KB
testcase_15 AC 7 ms
4,380 KB
testcase_16 AC 7 ms
4,384 KB
testcase_17 AC 20 ms
4,384 KB
testcase_18 AC 28 ms
4,380 KB
testcase_19 AC 8 ms
4,380 KB
testcase_20 AC 51 ms
4,380 KB
testcase_21 AC 52 ms
4,380 KB
testcase_22 AC 60 ms
4,384 KB
testcase_23 AC 51 ms
4,380 KB
testcase_24 AC 51 ms
4,384 KB
testcase_25 AC 51 ms
4,380 KB
testcase_26 AC 51 ms
4,384 KB
testcase_27 AC 2 ms
4,380 KB
testcase_28 AC 124 ms
4,380 KB
testcase_29 AC 103 ms
4,384 KB
testcase_30 AC 103 ms
4,380 KB
testcase_31 AC 2 ms
4,380 KB
testcase_32 AC 2 ms
4,384 KB
権限があれば一括ダウンロードができます

ソースコード

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';
	}
}
0