結果

問題 No.2365 Present of good number
ユーザー erbowlerbowl
提出日時 2023-07-02 09:52:37
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 7,101 bytes
コンパイル時間 2,654 ms
コンパイル使用メモリ 222,980 KB
最終ジャッジ日時 2025-02-15 05:33:35
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 17 WA * 22
権限があれば一括ダウンロードができます

ソースコード

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

typedef long long ll;
typedef long double ld;
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct Eratos {
vector<int> primes;
vector<bool> isprime;
vector<int> mebius;
vector<int> min_factor;
Eratos(int MAX) : primes(),
isprime(MAX+1, true),
mebius(MAX+1, 1),
min_factor(MAX+1, -1) {
isprime[0] = isprime[1] = false;
min_factor[0] = 0, min_factor[1] = 1;
for (int i = 2; i <= MAX; ++i) {
if (!isprime[i]) continue;
primes.push_back(i);
mebius[i] = -1;
min_factor[i] = i;
for (int j = i*2; j <= MAX; j += i) {
isprime[j] = false;
if ((j / i) % i == 0) mebius[j] = 0;
else mebius[j] = -mebius[j];
if (min_factor[j] == -1) min_factor[j] = i;
}
}
}
// prime factorization
vector<pair<int,int>> prime_factors(int n) {
vector<pair<int,int> > res;
while (n != 1) {
int prime = min_factor[n];
int exp = 0;
while (min_factor[n] == prime) {
++exp;
n /= prime;
}
res.push_back(make_pair(prime, exp));
}
return res;
}
// enumerate divisors
vector<int> divisors(int n) {
vector<int> res({1});
auto pf = prime_factors(n);
for (auto p : pf) {
int n = (int)res.size();
for (int i = 0; i < n; ++i) {
int v = 1;
for (int j = 0; j < p.second; ++j) {
v *= p.first;
res.push_back(res[i] * v);
}
}
}
return res;
}
};
const long long MOD = 1e9+7;
long long modinv(long long a, long long mod) {
long long b = mod, u = 1, v = 0;
while (b) {
long long t = a/b;
a -= t*b; swap(a, b);
u -= t*v; swap(u, v);
}
u %= mod;
if (u < 0) u += mod;
return u;
}
// matrix
template<int MOD> struct Matrix {
vector<vector<long long> > val;
Matrix(int n, int m, long long x = 0) : val(n, vector<long long>(m, x)) {}
void init(int n, int m, long long x = 0) {val.assign(n, vector<long long>(m, x));}
size_t size() const {return val.size();}
inline vector<long long>& operator [] (int i) {return val[i];}
};
template<int MOD> ostream& operator << (ostream& s, Matrix<MOD> A) {
s << endl;
for (int i = 0; i < A.size(); ++i) {
for (int j = 0; j < A[i].size(); ++j) {
s << A[i][j] << ", ";
}
s << endl;
}
return s;
}
template<int MOD> Matrix<MOD> operator * (Matrix<MOD> A, Matrix<MOD> B) {
Matrix<MOD> R(A.size(), B[0].size());
for (int i = 0; i < A.size(); ++i)
for (int j = 0; j < B[0].size(); ++j)
for (int k = 0; k < B.size(); ++k)
R[i][j] = (R[i][j] + A[i][k] * B[k][j] % MOD) % MOD;
return R;
}
template<int MOD> Matrix<MOD> pow(Matrix<MOD> A, long long n) {
Matrix<MOD> R(A.size(), A.size());
for (int i = 0; i < A.size(); ++i) R[i][i] = 1;
while (n > 0) {
if (n & 1) R = R * A;
A = A * A;
n >>= 1;
}
return R;
}
// modint
template<int MOD> struct Fp {
// inner value
long long val;
// constructor
constexpr Fp() noexcept : val(0) { }
constexpr Fp(long long v) noexcept : val(v % MOD) {
if (val < 0) val += MOD;
}
constexpr long long get() const noexcept { return val; }
constexpr int get_mod() const noexcept { return MOD; }
// arithmetic operators
constexpr Fp operator - () const noexcept {
return val ? MOD - val : 0;
}
constexpr Fp operator + (const Fp &r) const noexcept { return Fp(*this) += r; }
constexpr Fp operator - (const Fp &r) const noexcept { return Fp(*this) -= r; }
constexpr Fp operator * (const Fp &r) const noexcept { return Fp(*this) *= r; }
constexpr Fp operator / (const Fp &r) const noexcept { return Fp(*this) /= r; }
constexpr Fp& operator += (const Fp &r) noexcept {
val += r.val;
if (val >= MOD) val -= MOD;
return *this;
}
constexpr Fp& operator -= (const Fp &r) noexcept {
val -= r.val;
if (val < 0) val += MOD;
return *this;
}
constexpr Fp& operator *= (const Fp &r) noexcept {
val = val * r.val % MOD;
return *this;
}
constexpr Fp& operator /= (const Fp &r) noexcept {
long long a = r.val, b = MOD, u = 1, v = 0;
while (b) {
long long t = a / b;
a -= t * b, swap(a, b);
u -= t * v, swap(u, v);
}
val = val * u % MOD;
if (val < 0) val += MOD;
return *this;
}
constexpr Fp pow(long long n) const noexcept {
Fp res(1), mul(*this);
while (n > 0) {
if (n & 1) res *= mul;
mul *= mul;
n >>= 1;
}
return res;
}
constexpr Fp inv() const noexcept {
Fp res(1), div(*this);
return res / div;
}
// other operators
constexpr bool operator == (const Fp &r) const noexcept {
return this->val == r.val;
}
constexpr bool operator != (const Fp &r) const noexcept {
return this->val != r.val;
}
friend constexpr istream& operator >> (istream &is, Fp<MOD> &x) noexcept {
is >> x.val;
x.val %= MOD;
if (x.val < 0) x.val += MOD;
return is;
}
friend constexpr ostream& operator << (ostream &os, const Fp<MOD> &x) noexcept {
return os << x.val;
}
friend constexpr Fp<MOD> modpow(const Fp<MOD> &r, long long n) noexcept {
return r.pow(n);
}
friend constexpr Fp<MOD> modinv(const Fp<MOD> &r) noexcept {
return r.inv();
}
};
signed main(){
using mint = Fp<MOD>;
ll n,k;
std::cin >> n>>k;
Eratos era(n+10);
set<ll> p;
queue<ll> q;
for (auto e : era.prime_factors(n)) {
q.push(e.first);
p.insert(e.first);
}
while(q.size()){
auto now = q.front();q.pop();
auto es = era.prime_factors(now);
for (auto e : es) {
for (auto ee : era.prime_factors(e.first+1)) {
if(p.find(ee.first)==p.end()){
p.insert(ee.first);
q.push(ee.first);
}
}
}
}
Matrix<MOD> m(p.size(), p.size(), 0);
unordered_map<ll,ll> pind;
ll ind = 0;
for (auto e : p) {
pind[e] = ind;
ind++;
}
for (auto e : p) {
for (auto ee : era.prime_factors(e+1)) {
m[pind[e]][pind[ee.first]] += ee.second;
}
}
Matrix<MOD> c(1, p.size(), 0);
for (auto e : era.prime_factors(n)) {
c[0][pind[e.first]] += e.second;
}
auto res = c*pow(m,k);
mint ans = 1;
for (auto e : p) {
ans *= mint(e).pow(res[0][pind[e]]);
}
std::cout << ans << std::endl;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0