結果
問題 | No.2979 直角三角形の個数 |
ユーザー |
|
提出日時 | 2024-12-03 19:00:43 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 23,925 bytes |
コンパイル時間 | 2,921 ms |
コンパイル使用メモリ | 272,764 KB |
最終ジャッジ日時 | 2025-02-26 10:48:44 |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 TLE * 1 |
other | AC * 26 |
ソースコード
/*** date : 2024-12-03 19:00:38* author : Nyaan*/#define NDEBUGusing namespace std;// intrinstic#include <immintrin.h>#include <algorithm>#include <array>#include <bitset>#include <cassert>#include <cctype>#include <cfenv>#include <cfloat>#include <chrono>#include <cinttypes>#include <climits>#include <cmath>#include <complex>#include <cstdarg>#include <cstddef>#include <cstdint>#include <cstdio>#include <cstdlib>#include <cstring>#include <deque>#include <fstream>#include <functional>#include <initializer_list>#include <iomanip>#include <ios>#include <iostream>#include <istream>#include <iterator>#include <limits>#include <list>#include <map>#include <memory>#include <new>#include <numeric>#include <ostream>#include <queue>#include <random>#include <set>#include <sstream>#include <stack>#include <streambuf>#include <string>#include <tr2/dynamic_bitset>#include <tuple>#include <type_traits>#include <typeinfo>#include <unordered_map>#include <unordered_set>#include <utility>#include <vector>// utilitynamespace Nyaan {using ll = long long;using i64 = long long;using u64 = unsigned long long;using i128 = __int128_t;using u128 = __uint128_t;template <typename T>using V = vector<T>;template <typename T>using VV = vector<vector<T>>;using vi = vector<int>;using vl = vector<long long>;using vd = V<double>;using vs = V<string>;using vvi = vector<vector<int>>;using vvl = vector<vector<long long>>;template <typename T>using minpq = priority_queue<T, vector<T>, greater<T>>;template <typename T, typename U>struct P : pair<T, U> {template <typename... Args>constexpr P(Args... args) : pair<T, U>(args...) {}using pair<T, U>::first;using pair<T, U>::second;P &operator+=(const P &r) {first += r.first;second += r.second;return *this;}P &operator-=(const P &r) {first -= r.first;second -= r.second;return *this;}P &operator*=(const P &r) {first *= r.first;second *= r.second;return *this;}template <typename S>P &operator*=(const S &r) {first *= r, second *= r;return *this;}P operator+(const P &r) const { return P(*this) += r; }P operator-(const P &r) const { return P(*this) -= r; }P operator*(const P &r) const { return P(*this) *= r; }template <typename S>P operator*(const S &r) const {return P(*this) *= r;}P operator-() const { return P{-first, -second}; }};using pl = P<ll, ll>;using pi = P<int, int>;using vp = V<pl>;constexpr int inf = 1001001001;constexpr long long infLL = 4004004004004004004LL;template <typename T>int sz(const T &t) {return t.size();}template <typename T, typename U>inline bool amin(T &x, U y) {return (y < x) ? (x = y, true) : false;}template <typename T, typename U>inline bool amax(T &x, U y) {return (x < y) ? (x = y, true) : false;}template <typename T>inline T Max(const vector<T> &v) {return *max_element(begin(v), end(v));}template <typename T>inline T Min(const vector<T> &v) {return *min_element(begin(v), end(v));}template <typename T>inline long long Sum(const vector<T> &v) {return accumulate(begin(v), end(v), 0LL);}template <typename T>int lb(const vector<T> &v, const T &a) {return lower_bound(begin(v), end(v), a) - begin(v);}template <typename T>int ub(const vector<T> &v, const T &a) {return upper_bound(begin(v), end(v), a) - begin(v);}constexpr long long TEN(int n) {long long ret = 1, x = 10;for (; n; x *= x, n >>= 1) ret *= (n & 1 ? x : 1);return ret;}template <typename T, typename U>pair<T, U> mkp(const T &t, const U &u) {return make_pair(t, u);}template <typename T>vector<T> mkrui(const vector<T> &v, bool rev = false) {vector<T> ret(v.size() + 1);if (rev) {for (int i = int(v.size()) - 1; i >= 0; i--) ret[i] = v[i] + ret[i + 1];} else {for (int i = 0; i < int(v.size()); i++) ret[i + 1] = ret[i] + v[i];}return ret;};template <typename T>vector<T> mkuni(const vector<T> &v) {vector<T> ret(v);sort(ret.begin(), ret.end());ret.erase(unique(ret.begin(), ret.end()), ret.end());return ret;}template <typename F>vector<int> mkord(int N, F f) {vector<int> ord(N);iota(begin(ord), end(ord), 0);sort(begin(ord), end(ord), f);return ord;}template <typename T>vector<int> mkinv(vector<T> &v) {int max_val = *max_element(begin(v), end(v));vector<int> inv(max_val + 1, -1);for (int i = 0; i < (int)v.size(); i++) inv[v[i]] = i;return inv;}vector<int> mkiota(int n) {vector<int> ret(n);iota(begin(ret), end(ret), 0);return ret;}template <typename T>T mkrev(const T &v) {T w{v};reverse(begin(w), end(w));return w;}template <typename T>bool nxp(T &v) {return next_permutation(begin(v), end(v));}// 返り値の型は入力の T に依存// i 要素目 : [0, a[i])template <typename T>vector<vector<T>> product(const vector<T> &a) {vector<vector<T>> ret;vector<T> v;auto dfs = [&](auto rc, int i) -> void {if (i == (int)a.size()) {ret.push_back(v);return;}for (int j = 0; j < a[i]; j++) v.push_back(j), rc(rc, i + 1), v.pop_back();};dfs(dfs, 0);return ret;}// F : function(void(T&)), mod を取る操作// T : 整数型のときはオーバーフローに注意するtemplate <typename T>T Power(T a, long long n, const T &I, const function<void(T &)> &f) {T res = I;for (; n; f(a = a * a), n >>= 1) {if (n & 1) f(res = res * a);}return res;}// T : 整数型のときはオーバーフローに注意するtemplate <typename T>T Power(T a, long long n, const T &I = T{1}) {return Power(a, n, I, function<void(T &)>{[](T &) -> void {}});}template <typename T>T Rev(const T &v) {T res = v;reverse(begin(res), end(res));return res;}template <typename T>vector<T> Transpose(const vector<T> &v) {using U = typename T::value_type;if(v.empty()) return {};int H = v.size(), W = v[0].size();vector res(W, T(H, U{}));for (int i = 0; i < H; i++) {for (int j = 0; j < W; j++) {res[j][i] = v[i][j];}}return res;}template <typename T>vector<T> Rotate(const vector<T> &v, int clockwise = true) {using U = typename T::value_type;int H = v.size(), W = v[0].size();vector res(W, T(H, U{}));for (int i = 0; i < H; i++) {for (int j = 0; j < W; j++) {if (clockwise) {res[W - 1 - j][i] = v[i][j];} else {res[j][H - 1 - i] = v[i][j];}}}return res;}} // namespace Nyaan// bit operationnamespace Nyaan {__attribute__((target("popcnt"))) inline int popcnt(const u64 &a) {return __builtin_popcountll(a);}inline int lsb(const u64 &a) { return a ? __builtin_ctzll(a) : 64; }inline int ctz(const u64 &a) { return a ? __builtin_ctzll(a) : 64; }inline int msb(const u64 &a) { return a ? 63 - __builtin_clzll(a) : -1; }template <typename T>inline int gbit(const T &a, int i) {return (a >> i) & 1;}template <typename T>inline void sbit(T &a, int i, bool b) {if (gbit(a, i) != b) a ^= T(1) << i;}constexpr long long PW(int n) { return 1LL << n; }constexpr long long MSK(int n) { return (1LL << n) - 1; }} // namespace Nyaan// inoutnamespace Nyaan {template <typename T, typename U>ostream &operator<<(ostream &os, const pair<T, U> &p) {os << p.first << " " << p.second;return os;}template <typename T, typename U>istream &operator>>(istream &is, pair<T, U> &p) {is >> p.first >> p.second;return is;}template <typename T>ostream &operator<<(ostream &os, const vector<T> &v) {int s = (int)v.size();for (int i = 0; i < s; i++) os << (i ? " " : "") << v[i];return os;}template <typename T>istream &operator>>(istream &is, vector<T> &v) {for (auto &x : v) is >> x;return is;}istream &operator>>(istream &is, __int128_t &x) {string S;is >> S;x = 0;int flag = 0;for (auto &c : S) {if (c == '-') {flag = true;continue;}x *= 10;x += c - '0';}if (flag) x = -x;return is;}istream &operator>>(istream &is, __uint128_t &x) {string S;is >> S;x = 0;for (auto &c : S) {x *= 10;x += c - '0';}return is;}ostream &operator<<(ostream &os, __int128_t x) {if (x == 0) return os << 0;if (x < 0) os << '-', x = -x;string S;while (x) S.push_back('0' + x % 10), x /= 10;reverse(begin(S), end(S));return os << S;}ostream &operator<<(ostream &os, __uint128_t x) {if (x == 0) return os << 0;string S;while (x) S.push_back('0' + x % 10), x /= 10;reverse(begin(S), end(S));return os << S;}void in() {}template <typename T, class... U>void in(T &t, U &...u) {cin >> t;in(u...);}void out() { cout << "\n"; }template <typename T, class... U, char sep = ' '>void out(const T &t, const U &...u) {cout << t;if (sizeof...(u)) cout << sep;out(u...);}struct IoSetupNya {IoSetupNya() {cin.tie(nullptr);ios::sync_with_stdio(false);cout << fixed << setprecision(15);cerr << fixed << setprecision(7);}} iosetupnya;} // namespace Nyaan// debug#ifdef NyaanDebug#define trc(...) (void(0))#endif#ifndef NyaanDebug#define trc(...) (void(0))#endif#ifndef NyaanLocal#define trc2(...) (void(0))#endif// macro#define each(x, v) for (auto&& x : v)#define each2(x, y, v) for (auto&& [x, y] : v)#define all(v) (v).begin(), (v).end()#define rep(i, N) for (long long i = 0; i < (long long)(N); i++)#define repr(i, N) for (long long i = (long long)(N)-1; i >= 0; i--)#define rep1(i, N) for (long long i = 1; i <= (long long)(N); i++)#define repr1(i, N) for (long long i = (N); (long long)(i) > 0; i--)#define reg(i, a, b) for (long long i = (a); i < (b); i++)#define regr(i, a, b) for (long long i = (b)-1; i >= (a); i--)#define fi first#define se second#define ini(...) \int __VA_ARGS__; \in(__VA_ARGS__)#define inl(...) \long long __VA_ARGS__; \in(__VA_ARGS__)#define ins(...) \string __VA_ARGS__; \in(__VA_ARGS__)#define in2(s, t) \for (int i = 0; i < (int)s.size(); i++) { \in(s[i], t[i]); \}#define in3(s, t, u) \for (int i = 0; i < (int)s.size(); i++) { \in(s[i], t[i], u[i]); \}#define in4(s, t, u, v) \for (int i = 0; i < (int)s.size(); i++) { \in(s[i], t[i], u[i], v[i]); \}#define die(...) \do { \Nyaan::out(__VA_ARGS__); \return; \} while (0)namespace Nyaan {void solve();}int main() { Nyaan::solve(); }//using namespace std;using namespace std;using namespace std;namespace internal {unsigned long long non_deterministic_seed() {unsigned long long m =chrono::duration_cast<chrono::nanoseconds>(chrono::high_resolution_clock::now().time_since_epoch()).count();m ^= 9845834732710364265uLL;m ^= m << 24, m ^= m >> 31, m ^= m << 35;return m;}unsigned long long deterministic_seed() { return 88172645463325252UL; }// 64 bit の seed 値を生成 (手元では seed 固定)// 連続で呼び出すと同じ値が何度も返ってくるので注意// #define RANDOMIZED_SEED するとシードがランダムになるunsigned long long seed() {#if defined(DETERMINISTIC_SEED)return deterministic_seed();#elif defined(NyaanLocal) && !defined(RANDOMIZED_SEED)return deterministic_seed();#elsereturn non_deterministic_seed();#endif}} // namespace internalusing namespace std;namespace internal {template <typename T>using is_broadly_integral =typename conditional_t<is_integral_v<T> || is_same_v<T, __int128_t> ||is_same_v<T, __uint128_t>,true_type, false_type>::type;template <typename T>using is_broadly_signed =typename conditional_t<is_signed_v<T> || is_same_v<T, __int128_t>,true_type, false_type>::type;template <typename T>using is_broadly_unsigned =typename conditional_t<is_unsigned_v<T> || is_same_v<T, __uint128_t>,true_type, false_type>::type;#define ENABLE_VALUE(x) \template <typename T> \constexpr bool x##_v = x<T>::value;ENABLE_VALUE(is_broadly_integral);ENABLE_VALUE(is_broadly_signed);ENABLE_VALUE(is_broadly_unsigned);#undef ENABLE_VALUE#define ENABLE_HAS_TYPE(var) \template <class, class = void> \struct has_##var : false_type {}; \template <class T> \struct has_##var<T, void_t<typename T::var>> : true_type {}; \template <class T> \constexpr auto has_##var##_v = has_##var<T>::value;#define ENABLE_HAS_VAR(var) \template <class, class = void> \struct has_##var : false_type {}; \template <class T> \struct has_##var<T, void_t<decltype(T::var)>> : true_type {}; \template <class T> \constexpr auto has_##var##_v = has_##var<T>::value;} // namespace internalnamespace internal {// 整数, 整数列を 64 bit unsigned int へ移すusing u64 = unsigned long long;using u128 = __uint128_t;ENABLE_HAS_TYPE(first_type);ENABLE_HAS_TYPE(second_type);ENABLE_HAS_TYPE(iterator);template <typename T>u64 hash_function(const T& x) {static u64 r = seed();constexpr u64 z1 = 11995408973635179863ULL;if constexpr (is_broadly_integral_v<T>) {// Integralreturn (u64(x) ^ r) * z1;} else if constexpr (has_first_type_v<T> && has_second_type_v<T>) {// pairconstexpr u64 z2 = 10150724397891781847ULL;return hash_function(x.first) + hash_function(x.second) * z2;} else if constexpr (has_iterator_v<T>) {// Containerconstexpr u64 mod = (1LL << 61) - 1;constexpr u64 base = 950699498548472943ULL;u64 m = 0;for (auto& z : x) {u64 w;if constexpr (is_broadly_integral_v<T>) {w = u64(z) ^ r;} else {w = hash_function(z);}u128 y = u128(m) * base + (w & mod);m = (y & mod) + (y >> 61);if (m >= mod) m -= mod;}m ^= m << 24, m ^= m >> 31, m ^= m << 35;return m;} else {static_assert([]() { return false; }());}}template <typename Key>struct HashObject {size_t operator()(const Key& x) const { return hash_function(x); }};} // namespace internal/*@brief ハッシュ関数*/// 削除不可能な hashmap//// テンプレート引数// fixed_size : これを true にするするとバケットサイズが固定になる// get_hash : ハッシュ関数の指定// 引数// _default_value : val の初期値, この値で初期化// _default_size :// バケットサイズ, max(4, _default_size) 以上の 2 べきで初期化// ただし fixed_size が true の時にしかサイズを変更できないtemplate <typename Key, typename Val, bool fixed_size = false,unsigned long long (*get_hash)(const Key&) =internal::hash_function<Key>>struct UnerasableHashMap {int N, occupied_num, shift;vector<Key> keys;vector<Val> vals;vector<char> flag;Val default_value;int default_size;// サイズを n に変更するvoid init(int n, bool reset = false) {assert(n >= 4 && (n & (n - 1)) == 0);if constexpr (fixed_size) {assert(reset == true);n = N;}if (reset == true) {N = n, occupied_num = 0, shift = 64 - __builtin_ctz(n);keys.resize(n);vals.resize(n);flag.resize(n);fill(begin(vals), end(vals), default_value);fill(begin(flag), end(flag), 0);} else {N = n, shift = 64 - __builtin_ctz(n);vector<Key> keys2(n);vector<Val> vals2(n, default_value);vector<char> flag2(n);swap(keys, keys2), swap(vals, vals2), swap(flag, flag2);for (int i = 0; i < (int)flag2.size(); i++) {if (flag2[i]) {int j = hint(keys2[i]);keys[j] = keys2[i], vals[j] = vals2[i], flag[j] = 1;}}}}UnerasableHashMap(const Val& _default_value = Val{}, int _default_size = 4): occupied_num(0), default_value(_default_value) {if (fixed_size == false) _default_size = 4;N = 4;while (N < _default_size) N *= 2;default_size = N;init(N, true);}int hint(const Key& k) {int hash = get_hash(k) >> shift;while (flag[hash] && keys[hash] != k) hash = (hash + 1) & (N - 1);return hash;}// key が i である要素への参照を返すVal& operator[](const Key& k) {int i = hint(k);if (!flag[i]) {if constexpr (fixed_size == false) {if (occupied_num * 2 >= N) {init(2 * N), i = hint(k);}}keys[i] = k, flag[i] = 1, occupied_num++;}return vals[i];}Val get(const Key& k) {int i = hint(k);return flag[i] ? vals[i] : default_value;}// 走査, f に関数 f(key, val) を入れるtemplate <typename F>void enumerate(const F f) {for (int i = 0; i < (int)flag.size(); i++) {if (flag[i]) f(keys[i], vals[i]);}}int count(const Key& k) { return flag[hint(k)]; }bool contain(const Key& k) { return flag[hint(k)]; }int size() const { return occupied_num; }void reset() { init(default_size, true); }void clear() { init(default_size, true); }};using namespace std;// floor(sqrt(n)) を返す (ただし n が負の場合は 0 を返す)long long isqrt(long long n) {if (n <= 0) return 0;long long x = sqrt(n);while ((x + 1) * (x + 1) <= n) x++;while (x * x > n) x--;return x;}namespace EnumerateQuotientImpl {long long fast_div(long long a, long long b) { return 1.0 * a / b; };long long slow_div(long long a, long long b) { return a / b; };} // namespace EnumerateQuotientImpl// { (q, l, r) : forall x in (l,r], floor(N/x) = q }// を引数に取る関数f(q, l, r)を渡す。範囲が左に半開なのに注意// 商は小さい方から走査するtemplate <typename T, typename F>void enumerate_quotient(T N, const F& f) {T sq = isqrt(N);#define FUNC(d) \T upper = N, quo = 0; \while (upper > sq) { \T thres = d(N, (++quo + 1)); \f(quo, thres, upper); \upper = thres; \} \while (upper > 0) { \f(d(N, upper), upper - 1, upper); \upper--; \}if (N <= 1e12) {FUNC(EnumerateQuotientImpl::fast_div);} else {FUNC(EnumerateQuotientImpl::slow_div);}#undef FUNC}/*** @brief 商の列挙*/// Prime Sieve {2, 3, 5, 7, 11, 13, 17, ...}vector<int> prime_enumerate(int N) {vector<bool> sieve(N / 3 + 1, 1);for (int p = 5, d = 4, i = 1, sqn = sqrt(N); p <= sqn; p += d = 6 - d, i++) {if (!sieve[i]) continue;for (int q = p * p / 3, r = d * p / 3 + (d * p % 3 == 2), s = 2 * p,qe = sieve.size();q < qe; q += r = s - r)sieve[q] = 0;}vector<int> ret{2, 3};for (int p = 5, d = 4, i = 1; p <= N; p += d = 6 - d, i++)if (sieve[i]) ret.push_back(p);while (!ret.empty() && ret.back() > N) ret.pop_back();return ret;}// f(n, p, c) : n = pow(p, c), f is multiplicative functiontemplate <typename T, T (*f)(int, int, int)>struct enamurate_multiplicative_function {enamurate_multiplicative_function(int _n): ps(prime_enumerate(_n)), a(_n + 1, T()), n(_n), p(ps.size()) {}vector<T> run() {a[1] = 1;dfs(-1, 1, 1);return a;}private:vector<int> ps;vector<T> a;int n, p;void dfs(int i, long long x, T y) {a[x] = y;if (y == T()) return;for (int j = i + 1; j < p; j++) {long long nx = x * ps[j];long long dx = ps[j];if (nx > n) break;for (int c = 1; nx <= n; nx *= ps[j], dx *= ps[j], ++c) {dfs(j, nx, y * f(dx, ps[j], c));}}}};/*** @brief 乗法的関数の列挙*/namespace multiplicative_function {template <typename T>T moebius(int, int, int c) {return c == 0 ? 1 : c == 1 ? -1 : 0;}template <typename T>T sigma0(int, int, int c) {return c + 1;}template <typename T>T sigma1(int n, int p, int) {return (n - 1) / (p - 1) + n;}template <typename T>T totient(int n, int p, int) {return n - n / p;}} // namespace multiplicative_functiontemplate <typename T>static constexpr vector<T> mobius_function(int n) {enamurate_multiplicative_function<T, multiplicative_function::moebius<T>> em(n);return em.run();}template <typename T>static constexpr vector<T> sigma0(int n) {enamurate_multiplicative_function<T, multiplicative_function::sigma0<T>> em(n);return em.run();}template <typename T>static constexpr vector<T> sigma1(int n) {enamurate_multiplicative_function<T, multiplicative_function::sigma1<T>> em(n);return em.run();}template <typename T>static constexpr vector<T> totient(int n) {enamurate_multiplicative_function<T, multiplicative_function::totient<T>> em(n);return em.run();}/*** @brief 有名な乗法的関数* @docs docs/multiplicative-function/mf-famous-series.md*/using namespace Nyaan;ll naive(ll N) {ll ans = 0;rep1(m, N) rep1(n, m - 1) {ll s = m * (m + n) * 2;if (s > N) break;if (gcd(m, n) != 1) continue;ans += N / s;}return ans;}// 1 + 2 + ... + xll C2(ll x) { return x * (x + 1) / 2; }ll f(ll x) {if (x == 0) return 0;ll s = 0;enumerate_quotient(x, [&](ll z, ll L, ll R) {// z, m in (L, R]auto g = [&](ll q, ll l, ll r) {ll ml = max(L, l / 2) + 1;ll mr = min(R, r) + 1;if (ml < mr) {ll t = 0;// -sum_{ml <= m < mr} max(l, m)ll p = min(max(l, ml), mr);// [ml, p) は l, [p, mr) は mt -= (p - ml) * l;t -= C2(mr - 1) - C2(p - 1);// sum_{ml <= m < mr} min(r, 2m-1)p = min(max(r / 2 + 1, ml), mr);// [ml, p) は 2m-1, [p, mr) は rt += (C2(p - 1) - C2(ml - 1)) * 2 - (p - ml);t += (mr - p) * r;s += q * t;return true;}return false;};// enumerate_quotient(z, g);// (L, R] と (l/2, r] が共通部分を持つことが重要auto d = [&](ll a, ll b) { return ll(1.0 * a / b); };// [i, j) -> (i-1, j-1]int fin = 0;for (ll i = max<ll>(1LL, L - 1), j; i <= z; i = j) {ll zi = d(z, i);j = d(z, zi) + 1;int res = g(zi, i - 1, j - 1);if (res and fin == 0) fin = 1;if (fin == 1 and !res) break;}});return s;}ll calc(ll N) {N /= 2;ll sq = sqrt(N) + 3;vi mo = mobius_function<int>(sq);ll ans = 0;rep1(i, sq - 1) {if (mo[i] == 0) continue;ans += f(N / (i * i)) * mo[i];}return ans;}ll calc2(ll N) {N /= 2;vi mo = mobius_function<int>(sqrt(N) + 3);UnerasableHashMap<ll, ll> mp;int sgn = 1;while (N) {for (ll i = 1; i * i <= N; i++) mp[N / (i * i)] += mo[i] * sgn;sgn = -sgn, N /= 2;}ll ans = 0;mp.enumerate([&](ll key, ll val) {if (val != 0) ans += f(key) * val;});return ans;}void q() {inl(N);trc(calc(N));/*ll ans = 0, sgn = 1;while (N) ans += calc(N) * sgn, sgn = -sgn, N /= 2;out(ans);*/out(calc2(N));}void Nyaan::solve() {int t = 1;// in(t);while (t--) q();}