結果
問題 | No.2410 Nine Numbers |
ユーザー |
|
提出日時 | 2023-08-11 21:53:49 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1 ms / 2,000 ms |
コード長 | 8,111 bytes |
コンパイル時間 | 1,725 ms |
コンパイル使用メモリ | 192,364 KB |
最終ジャッジ日時 | 2025-02-16 01:18:46 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 1 |
ソースコード
// #pragma GCC optimize("O3,unroll-loops")// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")#include "bits/stdc++.h"using namespace std;using ll = long long int;mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());/*** Integers modulo p, where p is a prime* Source: Aeren (modified from tourist?)* Modmul for 64-bit mod from kactl:ModMulLL* Works with p < 7.2e18 with x87 80-bit long double, and p < 2^52 ~ 4.5e12 with 64-bit*/template<typename T>struct Z_p{using Type = typename decay<decltype(T::value)>::type;static vector<Type> MOD_INV;constexpr Z_p(): value(){ }template<typename U> Z_p(const U &x){ value = normalize(x); }template<typename U> static Type normalize(const U &x){Type v;if(-mod() <= x && x < mod()) v = static_cast<Type>(x);else v = static_cast<Type>(x % mod());if(v < 0) v += mod();return v;}const Type& operator()() const{ return value; }template<typename U> explicit operator U() const{ return static_cast<U>(value); }constexpr static Type mod(){ return T::value; }Z_p &operator+=(const Z_p &otr){ if((value += otr.value) >= mod()) value -= mod(); return *this; }Z_p &operator-=(const Z_p &otr){ if((value -= otr.value) < 0) value += mod(); return *this; }template<typename U> Z_p &operator+=(const U &otr){ return *this += Z_p(otr); }template<typename U> Z_p &operator-=(const U &otr){ return *this -= Z_p(otr); }Z_p &operator++(){ return *this += 1; }Z_p &operator--(){ return *this -= 1; }Z_p operator++(int){ Z_p result(*this); *this += 1; return result; }Z_p operator--(int){ Z_p result(*this); *this -= 1; return result; }Z_p operator-() const{ return Z_p(-value); }template<typename U = T>typename enable_if<is_same<typename Z_p<U>::Type, int>::value, Z_p>::type &operator*=(const Z_p& rhs){#ifdef _WIN32uint64_t x = static_cast<int64_t>(value) * static_cast<int64_t>(rhs.value);uint32_t xh = static_cast<uint32_t>(x >> 32), xl = static_cast<uint32_t>(x), d, m;asm("divl %4; \n\t": "=a" (d), "=d" (m): "d" (xh), "a" (xl), "r" (mod()));value = m;#elsevalue = normalize(static_cast<int64_t>(value) * static_cast<int64_t>(rhs.value));#endifreturn *this;}template<typename U = T>typename enable_if<is_same<typename Z_p<U>::Type, int64_t>::value, Z_p>::type &operator*=(const Z_p &rhs){uint64_t ret = static_cast<uint64_t>(value) * static_cast<uint64_t>(rhs.value) - static_cast<uint64_t>(mod()) * static_cast<uint64_t>(1.L /static_cast<uint64_t>(mod()) * static_cast<uint64_t>(value) * static_cast<uint64_t>(rhs.value));value = normalize(static_cast<int64_t>(ret + static_cast<uint64_t>(mod()) * (ret < 0) - static_cast<uint64_t>(mod()) * (ret >= static_cast<uint64_t>(mod()))));return *this;}template<typename U = T>typename enable_if<!is_integral<typename Z_p<U>::Type>::value, Z_p>::type &operator*=(const Z_p &rhs){value = normalize(value * rhs.value);return *this;}template<typename U>Z_p &operator^=(U e){if(e < 0) *this = 1 / *this, e = -e;Z_p res = 1;for(; e; *this *= *this, e >>= 1) if(e & 1) res *= *this;return *this = res;}template<typename U>Z_p operator^(U e) const{return Z_p(*this) ^= e;}Z_p &operator/=(const Z_p &otr){Type a = otr.value, m = mod(), u = 0, v = 1;if(a < (int)MOD_INV.size()) return *this *= MOD_INV[a];while(a){Type t = m / a;m -= t * a; swap(a, m);u -= t * v; swap(u, v);}assert(m == 1);return *this *= u;}template<typename U> friend const Z_p<U> &abs(const Z_p<U> &v){ return v; }Type value;};template<typename T> bool operator==(const Z_p<T> &lhs, const Z_p<T> &rhs){ return lhs.value == rhs.value; }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> bool operator==(const Z_p<T>& lhs, U rhs){ return lhs ==Z_p<T>(rhs); }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> bool operator==(U lhs, const Z_p<T> &rhs){ return Z_p<T>(lhs) == rhs; }template<typename T> bool operator!=(const Z_p<T> &lhs, const Z_p<T> &rhs){ return !(lhs == rhs); }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> bool operator!=(const Z_p<T> &lhs, U rhs){ return !(lhs== rhs); }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> bool operator!=(U lhs, const Z_p<T> &rhs){ return !(lhs== rhs); }template<typename T> bool operator<(const Z_p<T> &lhs, const Z_p<T> &rhs){ return lhs.value < rhs.value; }template<typename T> bool operator>(const Z_p<T> &lhs, const Z_p<T> &rhs){ return lhs.value > rhs.value; }template<typename T> bool operator<=(const Z_p<T> &lhs, const Z_p<T> &rhs){ return lhs.value <= rhs.value; }template<typename T> bool operator>=(const Z_p<T> &lhs, const Z_p<T> &rhs){ return lhs.value >= rhs.value; }template<typename T> Z_p<T> operator+(const Z_p<T> &lhs, const Z_p<T> &rhs){ return Z_p<T>(lhs) += rhs; }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> Z_p<T> operator+(const Z_p<T> &lhs, U rhs){ return Z_p<T>(lhs) += rhs; }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> Z_p<T> operator+(U lhs, const Z_p<T> &rhs){ return Z_p<T>(lhs) += rhs; }template<typename T> Z_p<T> operator-(const Z_p<T> &lhs, const Z_p<T> &rhs){ return Z_p<T>(lhs) -= rhs; }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> Z_p<T> operator-(const Z_p<T>& lhs, U rhs){ return Z_p<T>(lhs) -= rhs; }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> Z_p<T> operator-(U lhs, const Z_p<T> &rhs){ return Z_p<T>(lhs) -= rhs; }template<typename T> Z_p<T> operator*(const Z_p<T> &lhs, const Z_p<T> &rhs){ return Z_p<T>(lhs) *= rhs; }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> Z_p<T> operator*(const Z_p<T>& lhs, U rhs){ return Z_p<T>(lhs) *= rhs; }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> Z_p<T> operator*(U lhs, const Z_p<T> &rhs){ return Z_p<T>(lhs) *= rhs; }template<typename T> Z_p<T> operator/(const Z_p<T> &lhs, const Z_p<T> &rhs) { return Z_p<T>(lhs) /= rhs; }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> Z_p<T> operator/(const Z_p<T>& lhs, U rhs) { return Z_p<T>(lhs) /= rhs; }template<typename T, typename U, typename enable_if<is_integral<U>::value>::type* = nullptr> Z_p<T> operator/(U lhs, const Z_p<T> &rhs) { return Z_p<T>(lhs) /= rhs; }template<typename T> istream &operator>>(istream &in, Z_p<T> &number){typename common_type<typename Z_p<T>::Type, int64_t>::type x;in >> x;number.value = Z_p<T>::normalize(x);return in;}template<typename T> ostream &operator<<(ostream &out, const Z_p<T> &number){ return out << number(); }/*using ModType = int;struct VarMod{ static ModType value; };ModType VarMod::value;ModType &mod = VarMod::value;using Zp = Z_p<VarMod>;*/// constexpr int mod = 1e9 + 7; // 1000000007constexpr int mod = (119 << 23) + 1; // 998244353// constexpr int mod = 1e9 + 9; // 1000000009using Zp = Z_p<integral_constant<decay<decltype(mod)>::type, mod>>;template<typename T> vector<typename Z_p<T>::Type> Z_p<T>::MOD_INV;template<typename T = integral_constant<decay<decltype(mod)>::type, mod>>void precalc_inverse(int SZ){auto &inv = Z_p<T>::MOD_INV;if(inv.empty()) inv.assign(2, 1);for(; inv.size() <= SZ; ) inv.push_back((mod - 1LL * mod / (int)inv.size() * inv[mod % (int)inv.size()]) % mod);}template<typename T>vector<T> precalc_power(T base, int SZ){vector<T> res(SZ + 1, 1);for(auto i = 1; i <= SZ; ++ i) res[i] = res[i - 1] * base;return res;}template<typename T>vector<T> precalc_factorial(int SZ){vector<T> res(SZ + 1, 1); res[0] = 1;for(auto i = 1; i <= SZ; ++ i) res[i] = res[i - 1] * i;return res;}int main(){ios::sync_with_stdio(false); cin.tie(0);cout << "1 3 8 25 74 222 667 2000 6000\n" << '\n';}