CF1114C Trailing Loves (or L'oeufs?)

2026 年 2 月 26 日 星期四
3

CF1114C Trailing Loves (or L'oeufs?)

算法

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

思路

根据进制的知识,对于 kk 进制而言,只有当 nmodki=0n \bmod k^{i} = 0 时,kk 进制意义下的第 ii 位才会为零。 由于 k1012k \le 10^{12},所以直接进行除法操作肯定不行,考虑将 kk 质因数分解,对于 kk 的每一个质因数分别考虑。设 k=i=0spiαIk = \prod_{i = 0}^{s} p_{i}^{\alpha_{I}}n!=i=0spiβin! = \prod_{i = 0}^{s} p_{i}^{\beta_i}。则 n!n!kk 进制下末尾 00 的个数为 mini=0sβiαi\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;
}

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...