CodeForces 1114C

VJudge CodeForcces

算法

  • 数学(质因数分解,因数个数,进制)

思路

根据进制的知识,对于 \(k\) 进制而言,只有当 \(n \bmod k^{i} = 0\) 时,\(k\) 进制意义下的第 \(i\) 位才会为零。
由于 \(k \le 10^{12}\),所以直接进行除法操作肯定不行,考虑将 \(k\) 质因数分解,对于 \(k\) 的每一个质因数分别考虑。设 \(k = \prod_{i = 0}^{s} p_{i}^{\alpha_{I}}\)\(n! = \prod_{i = 0}^{s} p_{i}^{\beta_i}\)。则 \(n!\)\(k\) 进制下末尾 \(0\) 的个数为 \(\min_{i=0}^{s} \lfloor \frac{\beta_i}{\alpha_i} \rfloor\)

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;
long long divide[N][2];
int cnt = 0;

inline long long cal(long long a, long long b) {
  if (a < b) return 0;
  else return a / b + cal(a / b, b);
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  
  cout.tie(nullptr);
  
  long long n, k;
  cin >> n >> k;
  
  long long answer = 1ll << 62;
  
  // ! 注意枚举上界为 sqrt(k) 而不是 k
  for (long long i = 2; i * i <= k; i ++) {
    if (k % i == 0) {
      long long alpha = 0;
      while (k % i == 0) {
        k /= i;
        alpha ++;
      }
      
      divide[++ cnt][0] = i;
      divide[cnt][1] = alpha;
    }
  }
  
  if (k > 1) {
    divide[++ cnt][0] = k;
    divide[cnt][1] = 1;
  }
  
  for (int i = 1; i <= cnt; i++) {
    long long p = divide[i][0], alpha = divide[i][1], beta = cal(n, p);
    answer = min(answer, beta / alpha);
  }
  
  cout << answer << '\n';
  
  return 0;
}

posted @ 2025-07-11 10:59  Fallen_Leaf  阅读(10)  评论(0)    收藏  举报