/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 208ms 72.957 MiB
#2 Accepted 222ms 73.336 MiB
#3 Accepted 222ms 73.391 MiB
#4 Accepted 227ms 73.352 MiB
#5 Accepted 225ms 73.434 MiB
#6 Accepted 226ms 73.449 MiB

Code

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
//#include <queue>
//#include <numeric>
#include <cassert>

using namespace std;

#ifdef LOCAL_DEBUG
#include <local_debug.h>
#define DEBUG(...) DBG2::cprint(#__VA_ARGS__, __LINE__, __VA_ARGS__)
#else
#define DEBUG(...)
#endif

#define SZ(a) int((a).size())
#define REP(i,n) for(int i=0,_n=(n);i<_n;++i)
#define FOR(i,a,b) for(int i=(a),_b=(b);i<=_b;++i)

using llong = long long;
using VI = vector<int>;
using VVI = vector<VI>;
using II = pair<int,int>;

const int MAXN = 1000000;

const int MAXP = MAXN+1;
int lp[MAXP+1];
vector<int> primes;
void sieve() {
   for (int i = 2; i <= MAXP; ++i) {
      if (lp[i] == 0) {
         lp[i] = i;
         primes.push_back(i);
      }
      for (int p : primes) {
         if (p > lp[i] || i * p > MAXP) break;
         lp[i * p] = p;
      }
   }
}

vector<II> factorize(int n) {
   vector<II> res;
   while (n > 1) {
      int p = lp[n];
      if (res.empty() || res.back().first != p)
         res.push_back(II(p, 1));
      else
         res.back().second++;
      n /= p;
   }
   return res;
}


int main(int argc, char* argv[]) {
   ios_base::sync_with_stdio(false); 
   cin.tie(nullptr);

   sieve();
   vector< vector<II> > prime_factors(MAXP+1);
   FOR(x, 2, MAXP)
      prime_factors[x] = factorize(x);

   auto get_num_divisors = [&](int x, int y) -> int {
      int res = 1;
      const vector<II>& pfx = prime_factors[x];
      const vector<II>& pfy = prime_factors[y];
      int i = 0, j = 0;
      while (i < SZ(pfx) and j < SZ(pfy)) {
         if (pfx[i].first == pfy[i].first) {
            res *= pfx[i].second + pfy[i].second + 1;
            ++i, ++j;
         }
         else if (pfx[i].first == pfy[i].first) {
            res *= pfx[i].second + 1;
            ++i;
         }
         else {
            res *= pfy[j].second + 1;
            ++j;
         }
      }
      for (; i < SZ(pfx); i++)
         res *= pfx[i].second + 1;
      for (; j < SZ(pfy); j++)
         res *= pfy[j].second + 1;

      return res;
   };

   vector<int> T(MAXN+1);
   T[1] = 1;
   FOR(k, 2, MAXN) {
      // S = k*(k+1) / 2
      if ((k % 2) == 0) {
         T[k] = get_num_divisors(k/2, k+1);
      }
      else {
         T[k] = get_num_divisors(k, (k+1)/2);
      }
   }

   FOR(k, 2, MAXN)
      T[k] = max(T[k], T[k-1]);

   int TC;
   cin >> TC;
   FOR(tc, 1, TC) {
      int N;
      cin >> N;
      cout << T[N] << '\n';
   }

   return 0;
}

Information

Submit By
Type
Submission
Problem
P1180 Maximum Divisor
Contest
Brain Booster #9
Language
C++17 (G++ 13.2.0)
Submit At
2025-04-06 16:28:53
Judged At
2025-04-06 16:28:53
Judged By
Score
100
Total Time
227ms
Peak Memory
73.449 MiB