Advertisement
pb_jiang

t4

Jul 10th, 2022
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.17 KB | None | 0 0
  1. constexpr int MAXN = 1e5 + 3;
  2. class Solution {
  3.     // using ll = long long;
  4.     using ll = int;
  5.     const static int MOD = 1000 * 1000 * 1000 + 7;
  6.    
  7.     vector<int> not_prime;
  8.     vector<int> pf;
  9.     vector<int> pfcnt;
  10.     vector<int> pri;
  11.     int cnt = 0;
  12.     void init() {
  13.       not_prime = vector<int>(MAXN);
  14.       pf = vector<int>(MAXN);
  15.       pfcnt = vector<int>(MAXN);
  16.       pri = vector<int>(MAXN);
  17.       pf[1] = 1;
  18.       for (int i = 2; i < MAXN; ++i) {
  19.         if (!not_prime[i]) {
  20.           pri[cnt++] = i;
  21.           pf[i] = i;
  22.           pfcnt[i] = 1;
  23.         }
  24.         for (int j = 0; j < cnt; ++j) {
  25.           if (1ll * i * pri[j] >= MAXN) break;
  26.           not_prime[i * pri[j]] = 1;
  27.           pf[i * pri[j]] = pri[j];
  28.           pfcnt[i * pri[j]] = pfcnt[pri[j]] + 1;
  29.           if (i % pri[j] == 0) {
  30.             break;
  31.           }
  32.         }
  33.       }
  34.     }
  35.  
  36.     vector<vector<ll>> dp;
  37.    
  38.     vector<int> fs;
  39.     vector<int> fcnt;
  40.    
  41.     map<int, int> fmap;
  42.    
  43.     void factorize(int n) {
  44.         fmap.clear();
  45.         while(n != 1) {
  46.             fmap[pf[n]] += 1;
  47.             n = n / pf[n];
  48.         }
  49.     }
  50.    
  51.     vector<vector<int>> comb;
  52.     void get_c(int n, int k) {
  53.         comb = vector<vector<int>>(n + k, vector<int>(k, 0));
  54.         comb[0][0] = 1;
  55.         comb[1][0] = comb[1][1] = 1;
  56.         for (int i = 2; i < n + k; ++i) {
  57.             comb[i][0] = 1;
  58.             // comb[i][i] = 1;
  59.             for (int j = 1; j < k; ++j) {
  60.                 comb[i][j] = (comb[i - 1][j - 1] + comb[i - 1][j]) % MOD;
  61.             }
  62.         }
  63.     }
  64.    
  65.     void dfs(const vector<pair<int, int>>& fs, int beg, int acc, unordered_set<int>& s, int& dnum, int n, int v) {
  66.         if (beg == fs.size()) {
  67.             return;
  68.         }
  69.         for (int i = 0; i < fs[beg].second; ++i) {
  70.             if (s.count(acc) == 0) {
  71.                 s.insert(acc);
  72.                 dnum = (dnum + search(n - 1, acc)) % MOD;
  73.             }
  74.             if (s.count(v / acc) == 0) {
  75.                 s.insert(v/ acc);
  76.                 dnum = (dnum + search(n - 1, v/ acc)) % MOD;
  77.             }
  78.             dfs(fs, beg + 1, acc, s, dnum, n, v);
  79.             acc = acc * fs[beg].first;
  80.             dfs(fs, beg + 1, acc, s, dnum, n, v);
  81.         }
  82.     }
  83.     int search(int n, int v) {
  84.         int oldv = v;
  85.         if (dp[n][v] != -1) {
  86.             return dp[n][v];
  87.         }
  88.        
  89.         int& rs = dp[n][v];
  90.         int acc = 1;
  91.         while(v != 1) {
  92.             int k = pfcnt[v];
  93.             for (int i = 0; i < k; ++i) v = v / pf[v];
  94.             acc = (acc * comb[n + k][k] % MOD) % MOD;
  95.         }
  96.         rs = acc;
  97.         // unordered_set<int> vs;
  98.         // vs.insert(v);
  99.         // dp[n][v] = search(n - 1, v);
  100.         /*
  101.         for (int i = 2; i <= v; ++i) {
  102.             if (v % i == 0) {
  103.                 dp[n][oldv] = (dp[n][oldv] + search(n - 1, v / i)) % MOD;
  104.             }
  105.         }
  106.         */
  107.        
  108.         // factorize(v);
  109.         // vector<pair<int, int>> fs(fmap.begin(), fmap.end());
  110.         // dfs(fs, 0, 1, vs, dp[n][oldv], n, v);
  111.         /*
  112.         while (v != 1) {
  113.             if (vs.count(v/pf[v]) == 0) {
  114.                 vs.insert(v/pf[v]);
  115.                 dp[n][oldv] = (dp[n][oldv] + search(n - 1, v / pf[v])) % MOD;
  116.             }
  117.             if (vs.count(pf[v]) == 0) {
  118.                 dp[n][oldv] = (dp[n][oldv] + search(n - 1, pf[v])) % MOD;
  119.                 vs.insert(pf[v]);
  120.             }
  121.                
  122.             v = v / pf[v];
  123.         }
  124.        
  125.         if (vs.count(1) == 0)
  126.             dp[n][oldv] = (dp[n][oldv] + search(n - 1, 1)) % MOD;
  127.         */
  128.        
  129.         // printf("dp[%d][%d]: %d\n", n, oldv, dp[n][oldv]);
  130.         return dp[n][oldv];
  131.     }
  132.    
  133. public:
  134.     int idealArrays(int n, int maxValue) {
  135.         dp = vector<vector<ll>>(n, vector<ll>(maxValue + 1, -1));
  136.         dp[0] = vector<ll>(maxValue + 1, 1);
  137.         ll ans = 0;
  138.         init();
  139.         int k = 14; // log(1e4) ~= 13
  140.         get_c(n, k);
  141.         // cout << "get c" << endl;
  142.         for (int i = maxValue; i > 0; --i) {
  143.             ans = (ans + search(n - 1, i)) % MOD;
  144.         }
  145.         return ans;
  146.     }
  147. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement