• UVa 10780 (质因数分解) Again Prime? No Time.


    求mk整除n!,求k的最大值。

    现将m分解质因数,比如对于素数p1分解出来的指数为k1,那么n!中能分解出多少个p1出来呢?

    考虑10!中2的个数c:1~10中有10/2个数是2的倍数,c += 5;1~10中有10/4个数是4的倍数,所以c += 2,其中有10/8 = 1个数是8的倍数,所以c += 1;

    这样10!中就能分解出8个2

    对于每个素数p,求出ci / ki的最小值就是答案。

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <cstring>
     4 #include <vector>
     5 using namespace std;
     6 
     7 const int INF = 1000000000;
     8 const int maxn = 5000;
     9 bool vis[maxn + 10];
    10 int prime[700], pcnt = 0;
    11 
    12 void Init()
    13 {
    14     int m = sqrt(maxn + 0.5);
    15     for(int i = 2; i <= m; i++) if(!vis[i])
    16         for(int j = i*i; j<= maxn; j += i) vis[j] = true;
    17     for(int i = 2; i <= maxn; i++) if(!vis[i]) prime[pcnt++] = i;
    18 }
    19 
    20 vector<int> p, e, a;
    21 
    22 int main()
    23 {
    24     Init();
    25     //printf("%d
    ", pcnt);
    26     int T;
    27     scanf("%d", &T);
    28     for(int kase = 1; kase <= T; kase++)
    29     {
    30         p.clear(); e.clear(); a.clear();
    31         int m, n;
    32         scanf("%d%d", &m, &n);
    33         for(int i = 0; i < pcnt && m > 1; i++)
    34         {
    35             if(m % prime[i] == 0)
    36             {
    37                 int c = 0;
    38                 while(m % prime[i] == 0)
    39                 {
    40                     m /= prime[i];
    41                     c++;
    42                 }
    43                 e.push_back(c);
    44                 p.push_back(prime[i]);
    45             }
    46         }
    47 
    48         int ans = INF;
    49         for(int i = 0; i < p.size(); i++)
    50         {
    51             int c = 0, base = p[i];
    52             while(n >= base)
    53             {
    54                 c += n / base;
    55                 base *= p[i];
    56             }
    57             ans = min(ans, c / e[i]);
    58         }
    59         printf("Case %d:
    ", kase);
    60         if(ans) printf("%d
    ", ans);
    61         else puts("Impossible to divide");
    62     }
    63 
    64     return 0;
    65 }
    代码君
  • 相关阅读:
    centos 创建swap 交换分区
    nginx android app 慢网络请求超时
    使用docker toolbox 在windows上搭建统一环境
    Docker Volume 之权限管理(转)
    一次架构失误的反思
    Cannot connect to the Docker daemon. Is the docker daemon running on this host?
    docker-compose启动报错,解决方案
    php 执行程序分析
    继电器是如何成为CPU的(2)
    [每天默写一个算法]KMP
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4346148.html
Copyright © 2020-2023  润新知