結果

問題 No.2365 Present of good number
ユーザー tnakao0123tnakao0123
提出日時 2023-07-05 17:33:19
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 3,249 bytes
コンパイル時間 866 ms
コンパイル使用メモリ 76,980 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-07-19 11:47:01
合計ジャッジ時間 1,899 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 AC 2 ms
5,376 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 AC 2 ms
5,376 KB
testcase_08 WA -
testcase_09 WA -
testcase_10 AC 2 ms
5,376 KB
testcase_11 AC 2 ms
5,376 KB
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 AC 2 ms
5,376 KB
testcase_20 AC 2 ms
5,376 KB
testcase_21 WA -
testcase_22 WA -
testcase_23 AC 2 ms
5,376 KB
testcase_24 WA -
testcase_25 AC 2 ms
5,376 KB
testcase_26 WA -
testcase_27 AC 1 ms
5,376 KB
testcase_28 AC 2 ms
5,376 KB
testcase_29 AC 2 ms
5,376 KB
testcase_30 AC 2 ms
5,376 KB
testcase_31 WA -
testcase_32 AC 2 ms
5,376 KB
testcase_33 AC 2 ms
5,376 KB
testcase_34 WA -
testcase_35 WA -
testcase_36 AC 2 ms
5,376 KB
testcase_37 AC 2 ms
5,376 KB
testcase_38 AC 2 ms
5,376 KB
testcase_39 AC 2 ms
5,376 KB
testcase_40 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

/* -*- coding: utf-8 -*-
 *
 * 2365.cc:  No.2365 Present of good number - yukicoder
 */

#include<cstdio>
#include<vector>
#include<unordered_map>
#include<algorithm>
#include<utility>
 
using namespace std;

/* constant */

const int MAX_P = 100000;
const int MOD = 1000000007;

/* typedef */

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vpii;

template<const int MOD>
struct MI {
  int v;
  MI(): v() {}
  MI(int _v): v(_v % MOD) {}
  MI(long long _v): v(_v % MOD) {}

  MI operator+(const MI m) const { return MI(v + m.v); }
  MI operator-(const MI m) const { return MI(v + MOD - m.v); }
  MI operator*(const MI m) const { return MI((long long)v * m.v); }

  MI &operator+=(const MI m) { return (*this = *this + m); }
  MI &operator-=(const MI m) { return (*this = *this - m); }
  MI &operator*=(const MI m) { return (*this = *this * m); }

  bool operator==(const MI m) const { return v == m.v; }
  bool operator!=(const MI m) const { return v != m.v; }

  MI pow(long long n) const {  // a^n % MOD
    MI pm = 1, a = *this;
    while (n > 0) {
      if (n & 1) pm *= a;
      a *= a;
      n >>= 1;
    }
    return pm;
  }
};

typedef MI<MOD> mi0;
typedef MI<MOD - 1> mi1;

typedef unordered_map<int,mi1> umimi1;

/* global variables */

bool primes[MAX_P + 1];

/* subroutines */

int gen_primes(int maxp, vi &pnums) {
  fill(primes, primes + maxp + 1, true);
  primes[0] = primes[1] = false;

  int p;
  for (p = 2; p * p <= maxp; p++)
    if (primes[p]) {
      pnums.push_back(p);
      for (int q = p * p; q <= maxp; q += p) primes[q] = false;
    }
  for (; p <= maxp; p++)
    if (primes[p]) pnums.push_back(p);
  return (int)pnums.size();
}

bool prime_decomp(int n, vi &pnums, vpii& pds) {
  pds.clear();

  int pn = pnums.size();
  for (int i = 0; i < pn; i++) {
    int pi = pnums[i];
    if (pi * pi > n) {
      if (n > 1) pds.push_back(pii(n, 1));
      return true;
    }

    if (n % pi == 0) {
      int fi = 0;
      while (n % pi == 0) n /= pi, fi++;
      pds.push_back(pii(pi, fi));
    }
  }
  return false;
}

/* main */

int main() {
  vi pnums;
  gen_primes(MAX_P, pnums);

  int n;
  ll k;
  scanf("%d%lld", &n, &k);

  vpii pds;
  prime_decomp(n, pnums, pds);

  bool cont = false;
  umimi1 pfs;
  for (auto &pd: pds) {
    pfs[pd.first] = pd.second;
    if (pd.first > 3) cont = true;
  }

  while (k > 0 && cont) {
    cont = false;
    umimi1 pfs1;
    for (auto &pf: pfs) {
      int p = pf.first;
      mi1 f = pf.second;
      if (p == 2)
	pfs1[3] += f;
      else if (p == 3)
	pfs1[2] += f * 2;
      else {
	vpii pds;
	prime_decomp(p + 1, pnums, pds);
	for (auto &pd: pds) {
	  pfs1[pd.first] += f * pd.second;
	  if (pd.first > 3) cont = true;
	}
      }
    }
    swap(pfs, pfs1);
    k--;
  }
  //for (auto &pf: pfs) printf("%d^%d ", pf.first, pf.second.v);
  //putchar('\n');

  if (k > 0) {
    umimi1 pfs1;
    for (auto &pf: pfs) {
      int p = pf.first;
      mi1 f = pf.second;
      pfs1[p] += f * mi1(2).pow(k / 2);
      if (k & 1) {
	if (p == 2) pfs1[3] += f;
	else pfs1[2] += f * 2;
      }
    }
    swap(pfs, pfs1);
  }

  mi0 sum = 1;
  for (auto &pf: pfs)
    sum *= mi0(pf.first).pow(pf.second.v);

  printf("%d\n", sum.v);

  return 0;
}
0